EL
UNIVERSO
DIGITAL
DEL IBM PC, AT Y PS/2
Edición
4.0
(4ª edición)
Versión impresa del original electrónico ubicado en:
Limitación de garantía:
Pese a que todos los programas e ideas incluidas en el libro han sido
probados, el autor y el editor no se responsabilizan de los daños que su
funcionamiento pueda ocasionar bajo ninguna circunstancia ni están
obligados a corregir el contenido del libro.
Marcas registradas:
IBM PCjr, PC, XT, AT, PS/2, OS/2 y Microchannel son marcas registradas de International Business Machines.
MS-DOS, WINDOWS, Microsoft C y Microsoft Macro Assembler son marcas registradas de Microsoft Corporation.
DR-DOS es marca registrada de Digital Research Inc.
QEMM y Desqview son marcas registradas de Qarterdeck Corporation. UNIX es marca registrada de AT&T Bell Laboratories.
Intel es marca registrada de Intel Corporation. Motorola es marca registrada de Motorola Inc.
Turbo Assembler, Turbo C, Turbo Debugger y Borland C++ son marcas registradas de Borland International Inc.
EL UNIVERSO DIGITAL
DEL IBM PC, AT Y PS/2
Ciriaco García de Celis
Edición
4.0
EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2 - v4.0
Ciriaco García de Celis.
Grupo Universitario de Informática, 1992-1997.
Publica:
Asociación Grupo Universitario de informática, 1992-1997. Apartado de correos 6062, Valladolid.
Internet: http://www.gui.uva.es Autor:
Ciriaco García de Celis (http://www.gui.uva.es/~ciri) Registro de propiedad Intelectual nº 1121; Madrid, 1993. Versión electrónica en Internet:
http://www.gui.uva.es/udigital Imprimió, durante la etapa impresa:
Servicio de Reprografía de la Universidad de Valladolid. Casa del Estudiante, avda. Real de Burgos s/n.
[Actualmente no se edita impreso; absténganse de contactar con ellos]. Tirada, durante la etapa impresa:
Más de 1200 ejemplares. Licencia de uso y distribución: Ver página 11.
ÍNDICE
PRÓLOGO DE LA EDICIÓN 4.0 ELECTRÓNICA... 11
PRÓLOGO DE LA TERCERA EDICIÓN (1994)... 17
1 - INTRODUCCIÓN ... 21
1.1 - Números binarios, octales y hexadecimales ... 21
1.2 - Cambio de base ... 22
1.3 - Estructura elemental de la memoria ... 22
1.4 - Operaciones aritméticas sencillas en binario ... 23
1.5 - Complemento a dos... 23
1.6 - Agrupaciones de bytes ... 23
1.7 - Representación de datos en memoria... 23
1.8 - Operaciones lógicas en binario ... 24
2 - ARQUITECTURA E HISTORIA DE LOS MICROORDENADORES... 25
2.1 - Arquitectura Von Neuman... 25
2.2 - El microprocesador ... 26
2.3 - Breve historia del ordenador personal y el DOS ... 27
3 - MICROPROCESADORES 8086/88, 286, 386, 486 y Pentium ... 31
3.1 - Características generales ... 31
3.2 - Registros del 8086 y del 286 ... 33
3.3 - Registros del 386 y procesadores superiores ... 36
3.4 - Modos de direccionamiento... 36
3.5 - La pila... 38
3.6 - Un programa de ejemplo ... 39
4 - JUEGO DE INSTRUCCIONES 80x86 ... 41
4.1 - Descripción completa de las instrucciones... 41
4.1.1 - De carga de registros y direcciones ... 41
4.1.2 - De manipulación del registro de estado ... 43
4.1.3 - De manejo de la pila ... 45 4.1.4 - De transferencia de control... 46 4.1.5 - De entrada/salida... 49 4.1.6 - Aritméticas ... 49 Suma... 49 Resta... 51 Multiplicación... 53 División... 54 Conversiones ... 55 4.1.7 - Manipulación de cadenas... 55
4.1.8 - Operaciones lógicas a nivel de bit... 58
4.1.9 - De control del procesador... 59
4.1.10 - De rotación y desplazamiento ... 60
4.2 - Resumen alfabético de las instrucciones y banderines. Índice... 63
4.3 - Instrucciones específicas del 286, 386 y 486 en modo real ... 64
4.3.1 - Diferencias en el comportamiento global respecto al 8086 ... 64
4.3.2 - Instrucciones específicas del 286... 65
4.3.3 - Instrucciones propias del 386 y 486... 66
4.3.4 - Detección de un sistema AT o superior ... 68
4.3.5 - Evaluación exacta del microprocesador instalado... 68
5 - EL LENGUAJE ENSAMBLADOR DEL 80x86... 71
5.1 - Sintaxis de una línea en ensamblador... 71
5.2 - Constantes y operadores... 72
5.2.1 - Constantes... 72
5.2.2 - Operadores aritméticos ... 72
5.2.3 - Operadores lógicos... 73
5.2.4 - Operadores relacionales... 73
5.2.5 - Operadores de retorno de valores... 73
5.2.6 - Operadores de atributos ... 73
5.3 - Principales directivas ... 75
5.3.1 - De definición de datos ... 75
5.3.2 - De definición de símbolos... 75
5.3.3 - De control del ensamblador... 76
5.3.4 - De definición de segmentos y procedimientos... 76
5.3.5 - De referencias externas... 78
5.3.6 - De definición de bloques ... 78
5.3.7 - Condicionales ... 80
5.3.8 - De listado ... 80
5.4 - Macros... 81
5.4.1 - Definición y borrado de las macros ... 81
5.4.2 - Ejemplo de una macro sencilla... 82
5.4.3 - Parámetros formales y parámetros actuales... 82
5.4.4 - Etiquetas dentro de macros. Variables locales. ... 83
5.4.5 - Operadores de macros ... 84
5.4.6 - Directivas útiles para macros... 85
5.4.7 - Macros avanzadas con número variable de parámetros... 87
5.5 - Programación modular y paso de parámetros ... 88
6 - EL ENSAMBLADOR EN ENTORNO DOS... 91
6.1 - Tipos de programas ejecutables bajo DOS... 91
6.2 - Ejemplo de programa de tipo COM ... 91
6.3 - Ejemplo de programa de tipo EXE ... 92
6.4 - Proceso de ensamblaje ... 94
6.5 - La utilidad DEBUG/SYMDEB ... 96
6.6 - Las funciones del DOS y de la BIOS... 99
7 - ARQUITECTURA DEL PC, AT y PS/2 BAJO DOS ... 103
7.1 - Las interrupciones... 103
7.2 - La memoria. Los puertos de entrada y salida. ... 105
7.3 - La pantalla en modo texto... 105
7.4 - La pantalla en modo gráfico... 106
7.4.1 - Modos gráficos... 106
7.4.2 - Detección de la tarjeta gráfica instalada ... 108
7.4.3 - Introducción al estándar gráfico VGA... 108
7.4.4 - Ejemplo de gráficos empleando la BIOS... 114
7.4.5 - Ejemplo de gráficos a nivel hardware... 115
7.4.6 - El estándar gráfico VESA ... 116
7.5 - El teclado... 119 7.5.1 - Bajo nivel... 119 7.5.2 - Nivel intermedio ... 122 7.5.3 - Alto nivel... 125 7.6 - Los discos ... 125 7.6.1 - Estructura física ... 125
7.6.2 - Cabeza 0. Pista 0. Sector 1... 126
7.6.3 - La FAT ... 127
7.6.4 - El directorio raíz ... 129
7.6.6 - El BPB y el DPB... 131
7.6.7 - La BIOS y los disquetes ... 131
7.6.8 - Disquetes floptical 3½ de 20 Mb ... 132
7.6.9 - Ejemplo de acceso al disco a alto nivel... 132
7.6.10 - Ejemplo de acceso al disco a bajo nivel... 133
7.7 - El PSP ... 137
7.8 - El proceso de arranque del PC... 139
7.9 - Formato de las extensiones ROM ... 139
7.10 - Formato físico de los ficheros EXE... 140
8 - LA GESTIÓN DE MEMORIA DEL DOS ... 143
8.1 - Tipos de memoria en un PC ... 143
8.2 - Bloques de memoria ... 145
8.2.1 - El bloque de memoria del programa ... 145
8.2.2 - El bloque del entorno... 145
8.2.3 - Los bloques de control de memoria (MCB's) ... 146
8.2.4 - La cadena de los bloques de memoria ... 146
8.2.5 - Relación entre bloque de programa y de entorno... 147
8.2.6 - Tipos de bloques de memoria ... 147
8.2.7 - Liberar el espacio de entorno en programas residentes... 148
8.2.8 - Peculiaridades del MS-DOS 4.0 y 5.0... 148
8.2.9 - Cómo recorrer los bloques de memoria. Ejemplo... 149
8.3 - Memorias extendida y superior XMS... 152
8.4 - Memoria expandida EMS... 153
9 - SUBPROCESOS, RECUBRIMIENTOS Y FILTROS... 157
9.1 - Llamada a subprocesos y recubrimientos u overlays ... 157
9.2 - Construcción de filtros... 159
10 - PROGRAMAS RESIDENTES ... 161
10.1 - Principios básicos ... 161
10.2 - Un ejemplo sencillo... 162
10.3 - Localización de un programa residente... 163
10.3.1 - Método de los vectores de interrupción ... 163
10.3.2 - Método de la cadena de bloque de memoria... 163
10.3.3 - Método de la interrupción Multiplex... 164
10.4 - Expulsión de un programa residente de la memoria... 164
10.5 - Gestión avanzada de la interrupción Multiplex... 165
10.5.1 - El convenio BMB Compuscience ... 165
10.5.2 - El convenio CiriSOFT ... 165
10.5.3 - La propuesta AMIS ... 170
10.5.4 - Comparación entre métodos ... 172
10.6 - Métodos especiales para economizar memoria... 172
10.7 - Programas autoinstalables en memoria superior... 173
10.8 - Programas residentes en memoria extendida con DR-DOS 6.0 ... 174
10.9 - Ejemplo de programa residente que utiliza la BIOS... 176
10.10 - Uso sin límites de servicios del DOS en programas residentes ... 184
10.10.1 - Una primera aproximación ... 185
10.10.2 - Pasos a realizar para usar el DOS... 186
10.10.3 - Resumiendo, ¡no es tan difícil! ... 187
10.10.4 - Un método alternativo: el SDA ... 188
10.10.5 - Métodos menos ortodoxos ... 189
10.11 - Ejemplo de programa residente que utiliza el DOS ... 189
10.12 - Programas residentes invocables en modos gráficos... 197
10.13 - Programas residentes en entorno WINDOWS 3... 199
11 - CONTROLADORES DE DISPOSITIVO... 203
11.2 - Encabezamiento y palabra de atributos ... 203
11.3 - Rutinas de estrategia e interrupción ... 205
11.4 - Ordenes a soportar por el controlador de dispositivo... 205
11.5 - La cadena de controladores de dispositivo instalados... 210
11.6 - Ejemplo de controlador de dispositivo de caracteres... 212
11.7 - Ejemplo de controlador de dispositivo de bloques ... 214
11.7.1 - Disco virtual TURBODSK: Características... 214
11.7.2 - Ensamblando TURBODSK... 216
11.7.3 - Análisis detallado del listado de TURBODSK ... 216
11.8 - Los controladores de dispositivo y el DOS... 244
12 - EL HARDWARE DE APOYO AL MICROPROCESADOR... 245
12.1 - La arquitectura del ordenador compatible ... 245
12.2 - El interfaz de periféricos 8255 ... 247
12.2.1 - Descripción del integrado ... 247
12.2.2 - El 8255 en el PC... 248
12.2.3 - Un método para averiguar la configuración del PC/XT... 248
12.3 - El temporizador 8253 u 8254... 249
12.3.1 - Descripción del integrado ... 249
12.3.2 - El 8254 en el ordenador ... 255
12.3.3 - Temporización ... 256
12.3.4 - Síntesis de sonido ... 258
12.4 - El controlador de interrupciones 8259... 261
12.4.1 - Cómo y por qué de las interrupciones... 261
12.4.2 - Descripción del integrado 8259... 261
12.4.3 - El 8259 dentro del ordenador ... 267
12.4.4 - Ejemplo: cambio de la base de las interrupciones... 269
12.5 - El chip DMA 8237 ... 270
12.5.1 - El acceso directo a memoria ... 270
12.5.2 - Descripción del integrado 8237... 270
12.5.3 - El 8237 en el ordenador ... 279
12.5.4 - Ralentizar un equipo AT con el DMA ... 281
12.5.5 - Acerca de las páginas de DMA ... 283
12.6 - El controlador de disquetes NEC 765 ... 284
12.6.1 - La tecnología de grabación en disco... 284
12.6.2 - Descripción del FDC (Floppy Disk Controller) 765 ... 286
12.6.3 - El 765 dentro del ordenador ... 294
12.6.4 - Densidades de disco y formatos estándar ... 294
12.6.5 - Acceso a disco con DMA... 297
12.6.6 - Lectura y escritura de sectores de disco sin DMA... 305
12.6.7 - Programación avanzada del controlador de disquetes: 2M 3.0... 309
12.6.7.1 - Formato de la primera pista ... 311
12.6.7.2 - Puntualizaciones sobre el formato de máxima capacidad ... 315
12.6.7.3 - Descripción de funcionamiento del soporte residente... 316
12.6.7.4 - Descripción del programa de formateo (2MF) para 2M... 330
12.6.7.5 - Un programa para medir el rendimiento de los disquetes... 338
12.6.7.6 - La versión para PC/XT de 2M: 2MX ... 340
12.6.7.7 - La opción BIOS de 2M: 2M-ABIOS y 2M-XBIOS ... 341
12.6.7.8 - La utilidad 2MDOS ... 341
12.6.7.9 - Cómo superar los 2.000.000 de bytes en 3½: 2MGUI ... 342
12.6.7.10 - Uso de 2M 3.0 en OS/2 2.1... 345
12.7 - El disco duro del AT (IDE, MFM, Bus Local) ... 346
12.7.1 - El interface ... 346
12.7.2 - Programación de la controladora ... 346
12.7.3 - Ejemplo práctico de programación... 349
12.8.1 - El 8042... 351
12.8.2 - El teclado del AT... 352
12.8.3 - Comunicación CPU ─¾ teclado ... 352
12.8.4 - Comunicación teclado ─¾ CPU ... 355
12.9 - El puerto serie: UART 8250... 356
12.9.1 - Descripción del integrado ... 356
12.9.2 - El 8250 en el ordenador ... 363
12.9.3 - Ejemplo: autodiagnóstico del 8250 ... 364
12.10 - El puerto de la impresora... 365
12.10.1 - Los registros del puerto paralelo ... 365
12.10.2 - Envío de caracteres... 365
12.10.3 - Cable NULL-MODEM para conectar dos ordenadores ... 366
12.11 - El ratón ... 367
12.12 - El reloj de tiempo real del AT: Motorola MC146818... 368
12.12.1 - Descripción del integrado ... 368
12.12.2 - El MC146818 dentro del ordenador ... 370
12.12.3 - Un método para averiguar la configuración del AT y PS/2... 371
13 - EL ENSAMBLADOR Y EL LENGUAJE C ... 373
13.1 - Uso del Turbo C y Borland C a bajo nivel ... 373
13.1.1 - Acceso a los puertos de E/S ... 373
13.1.2 - Acceso a la memoria ... 373
13.1.3 - Control de interrupciones... 374
13.1.4 - Llamada a interrupciones ... 374
13.1.5 - Cambio de vectores de interrupción... 374
13.1.6 - Programas residentes... 375
13.1.7 - Variables globales predefinidas interesantes... 375
13.1.8 - Inserción de código en línea... 375
13.1.9 - Las palabras clave interrupt y asm... 375
13.2 - Interfaz C (Borland/Microsoft) - Ensamblador ... 376
13.2.1 - Modelos de memoria ... 376
13.2.2 - Integración de módulos en ensamblador ... 376
APÉNDICES: I Mapa de memoria ... 381
II Tabla de interrupciones del sistema ... 383
III Tabla de variables de la BIOS ... 385
IV Puertos de E/S ... 389
V Códigos de rastreo del teclado ... 391
VI Tamaños y tiempos de ejecución de las instrucciones ... 393
VII Señales del slot de expansión ISA ... 399
VIII Funciones del sistema, la BIOS y el DOS aludidas en este libro... 401
IX Especificaciones XMS y EMS: Todas sus funciones ... 423
X Juego de caracteres ASCII extendido ... 427
PRÓLOGO
DE LA EDICIÓN 4.0 ELECTRÓNICA*
(*)
http://www.gui.uva.es/udigital
Nota:Pudiendo haber discrepancias entre sucesivas ediciones de estas normas, la versión de referencia válida e inapelable será la ubicada en todo momento en la red, en la dirección electrónica arriba indicada o cualquier otra que pudiera sucederla.
Licencia de uso y distribución para particulares.
La edición 4.0 (4ª edición) de El Universo Digital del IBM PC, AT y PS/2 es un libro
electrónico/impreso de dominio público; de libre uso, difusión, copia y distribución entre particulares,
en cualquier soporte. Quienes decidan utilizarlo deberán registrarse por vía electrónica una sola vez, por
razones de ética (http://www.gui.uva.es/udigital). También es posible hacerlo enviando una carta o
postal ordinaria (mejor en un sobre) al autor, con cualquier texto, a la siguiente dirección:
Ciriaco García de Celis
Apartado
6105
47080
Valladolid
España
Indicando claramente que el motivo es registrar el Universo Digital. Los que hayan comprado
la versión impresa en persona no necesitan registrarse, aunque lo recibiría con agrado, incluso si ha
pasado bastante tiempo (pero si lo compraron por correo no deben registrarse: conservo su pedido). Me
gustaría conocer en alguna medida la difusión de la obra, en especial a partir de este momento, lo que
hasta ahora me resultaba algo más sencillo. Por supuesto, los datos o direcciones indicadas por los
usuarios nunca serán divulgados por mí.
Se aplican exactamente las mismas condiciones que para usuarios particulares, con la excepción
de que se recomienda un único registro electrónico o una sola carta o postal en representación de todos
los posibles usuarios de la entidad.
Licencia de distribución para empresas, asociaciones y organizaciones.
Editando
revistas (no libros) la distribución está permitida en cualquier formato digital (HTML,
PostScript, WordPerfect, texto, o cualesquiera otros) tanto en fragmentos como toda la obra completa.
Siendo el formato una revista impresa sólo se permiten fragmentos que no totalicen más del 75% de la
obra en los sucesivos números publicados. Es necesario citar la procedencia. La distribución por
empresas que cobren una cierta cantidad por el soporte es libre. Mi única sugerencia es que la empresa
me envíe una copia del soporte (CD, etc.) en que se publique, por cortesía.
Tratándose de empresas editoriales u otras cualesquiera que planeen incluirlo, entero o por
fragmentos, en el soporte impreso, electrónico u online de algún libro que vayan a publicar, deberían
contactar primero conmigo para negociar una nueva versión (que en todo caso no implicaría la
desaparición de ésta en su estatus actual).
Modificaciones.
La realización de cambios (añadidos, eliminación de contenidos o reemplazamiento de los
mismos) es competencia exclusiva del autor, que centraliza la generación de nuevas versiones
actualizadas. Quien realizara alguna modificación sin consentimiento habría de destinar la obra
resultante para uso personal e intransferible.
Orígenes de El Universo Digital.
El Universo Digital no nació tras una decisión premeditada. Su objetivo inicial fue dotar de un
manual de apoyo al Curso de Lenguaje Ensamblador, que ofrece todos los años la asociación Grupo
Universitario de Informática de la Universidad de Valladolid, en el marco de unos Cursos de
Introducción a la Informática -para los alumnos y personal en general de la Universidad- que abarcan
un espectro mucho más amplio que el de la programación de los ordenadores.
La primera versión ocupaba 116 páginas, cuando su denominación era aún la de Curso de
Ensamblador. Sin embargo, en una época en la que era difícil encontrar información, y buena
bibliografía especializada, el autor siguió recopilando material interesante y añadiéndolo al curso. Una
buena parte de dicho material y del añadido después ha sido además de cosecha propia. La primera
edición de El Universo Digital, editada no mucho tiempo después del manual del curso, rebasó
ligeramente las 300 páginas. Posteriormente se incrementaría aún algo más, hasta las 420 de la 3ª
edición que ha mantenido durante la mayor parte del tiempo.
El DOS en la actualidad.
Actualmente, y desde hace algún tiempo, la programación en DOS ya no es importante, y
mucho menos al nivel que desarrolla este libro, y ello pese a que incluso Windows 95 corre aún en
alguna parte sobre DOS, comportamiento que irá reduciéndose hasta la eliminación en próximas
versiones.
El futuro de la programación, sin embargo, no es sólo para los programadores de alto nivel. En
alguna manera, los propios usuarios pueden y podrán cada vez en mayor medida hacer sus propios
programas incluso sin darse cuenta. Sin embargo, siempre hay alguien que tiene que construir los
sistemas operativos, y sobre todo, los controladores para dar soporte a los dispositivos en los diversos
sistemas operativos. Por no mencionar las aplicaciones especializadas, desde máquinas industriales al
microprocesador de las sondas espaciales (que, evidentemente, no corre bajo Windows). Es para los
programadores de sistemas, y para aquellos que necesitan o quieren saber cómo funciona el PC por
dentro, como ejemplo práctico de arquitectura interna de un ordenador, para los que va destinado este
libro. Que podrán practicar en un entorno cómodo para este tipo de programación, como es el DOS
(que deja todo el control de la máquina a cada tarea). Aunque algunos contenidos muy relacionados con
el DOS siguen presentes en esta obra, el lector habrá de tener en cuenta si es pertinente profundizar en
ellos o no, en la época que vivimos.
Mis contactos con editoriales.
Mi objetivo inicial no fue publicarlo, aunque hace dos o tres años sí me lo planteé un poco en
serio.
Las ventajas de una edición oficial sería su no engorrosa distribución (uno de los motivos por
los que siempre ha costado poco es porque nuestra Asociación y el propio autor ha puesto su mano de
obra gratis), así como su mayor difusión. Puesto en contacto con cuatro prestigiosas editoriales; las que
han respondido han valorado muy positivamente la obra, sin embargo la han rechazado aduciendo otros
motivos («sobrecarga del programa editorial», solapamiento en contenidos con «obras publicadas o
en fase de publicación», o simplemente «falta de interés comercial»). Una de ellas aún no ha
respondido.
Los inconvenientes de su publicación por una editorial serían el importante aumento de precio,
y mi renuncia a los derechos de distribución (en particular, nuestra Asociación tendría que comprar en
la librería los ejemplares para nuestros cursos).
Sin embargo, la ventaja de la publicación para facilitar la difusión popular es obvia, máxime si
lo hace una editorial importante (si no, no aparecería en todas las estanterías, la publicidad la harían los
lectores lentamente, como ya se venía haciendo, y la distribución sería incluso más limitada pese al
recurso a los baratos servicios de reprografía por parte de los usuarios).
El Universo Digital en Internet.
Mi decisión final ya la había acariciado con anterioridad. Algo había que hacer, pues la
distribución gratuita del libro llevaba mucho tiempo.
Uno de los motivos que han terminado empujándome a esta decisión, ha sido la considerable
cantidad de pedidos que hemos recibido desde países de hispanoamérica. Se trata de ciudadanos que
conocen el índice del libro a través del Web y lo piden, sobre todo desde México. Sin embargo, sólo en
la primera ocasión lo he enviado (a Perú); los motivos son, desgraciadamente, la práctica imposibilidad
de comerciar a pequeña escala con esos países (no existe el envío contrarreembolso, por ejemplo); las
enormes demoras del envío por superficie (el coste del envío aéreo supera el del propio libro) y las
complicadas gestiones de pago e injustas comisiones bancarias (aunque las pague el usuario final);
finalmente habría que añadir incluso mi temor inconsciente a un aumento incontrolado de la demanda,
cuando ya había demasiado trabajo que hacer para atender la de origen nacional (en mi memoria estaba
lo que ocurrió cuando empezaron a aparecer mensajes y comenzaron a recibirse pedidos por FidoNET).
Pido desde aquí disculpas a todos los que lo han solicitado desde fuera de España, mayores además si
no he contestado el E-Mail por no haber tomado aún una decisión al respecto.
El Universo Digital de dominio público en formato electrónico, podrá ser accedido desde
cualquier lugar del mundo, y en cualquier CD de los kioscos.
El inconveniente es que no todos tienen igual acceso a estas redes y medios, aunque ese
inconveniente disminuirá exponencialmente con el tiempo (con el mismo exponente con que crezca la
red).
Fin de la distribución impresa.
Naturalmente, una vez que he renunciado a mis derechos sobre el libro, donándolo al dominio
público, ya no estoy obligado a venderlo impreso (medida tomada únicamente para mantener el
copyright). Realmente, no tenemos tiempo ni medios para atender la demanda actual: aunque es una
medida dura de imponer, lamento renunciar a realizar más envíos de ejemplares impresos. Renuncio
con ello a facilitar su difusión a los lectores menos introducidos en las redes telemáticas, pero beneficio
a otros muchos, que además podrán seguir usando la versión manuscrita utilizando una impresora.
Por otro lado, haber facturado sólo aproximadamente el coste de impresión y distribución, me
permiten tomar esa decisión sin temer el enfado de quienes lo habían comprado. El coste de impresión
de los últimos números en la reprografía oficial de la Universidad (rechazamos opciones más baratas de
menor calidad), encuadernación y disquete era de 1900 pts. El libro (realmente, apuntes técnicos
fotocopiados) se vendía a 2100 pts más gastos de envío. Ese margen de beneficios era más bien de
maniobra, ya que por ejemplo, en los ejemplares que no llegaban a su destino, el coste del envío y la
devolución lo pagábamos nosotros. Cada envío llevaba una media de 20 minutos de tiempo total de
mano de obra, contabilizando la preparación de los libros (transporte físico, disquete, gestión del
pedido...), y la mayoría eran de una sola unidad (pese a que se penalizaba su envío con 100 pts
adicionales). El precio de los más de 1200 Universos Digitales vendidos ha tenido un crecimiento
nominal cero en los cinco años de difusión impresa.
Obtención de ejemplares impresos.
Aunque en general no se harán más envíos, la única excepción corresponderá a los pedidos
realizados desde bibliotecas (universitarias o no universitarias), que tal vez no tengan la impresora
adecuada o tiempo para reproducirlo, lo que perjudicaría a un amplio conjunto potencial de usuarios.
No se harán envíos a otras organizaciones, ni a librerías o a particulares. Subrayamos que El Universo
Digital impreso tiene el carácter legal de apuntes técnicos impresos y no de libro.
Los pedidos de ejemplares impresos serán admitidos sólo desde España. Habrán de realizarse
exclusivamente por carta impresa, que deberá estar compulsada por el sello y en su caso papel oficial de
la biblioteca que hace el pedido, además de debidamente firmada por quien corresponda. Es
conveniente que figure el teléfono de la biblioteca o en su defecto de la conserjería del centro. Además
del nombre completo, dirección y NIF. Nos reservamos el derecho de rechazar aquellos pedidos que no
cumplan alguno de estos requisitos, o los de sospechosa procedencia. La dirección es: Grupo
Universitario de Informática. Apartado 6062. 47080 Valladolid. El precio por ejemplar será el que
figure en la factura que realizará el propio servicio de reprografía (unas 2000 pts/unidad); sumando al
final el coste exacto del envío y los disquetes.
Agradecimientos.
Agradezco desde aquí al servicio de Reprografía de la Universidad, ubicado en la Casa del
Estudiante, el esmero puesto durante tanto tiempo en la reproducción y encuadernación de cada número
durante la etapa impresa. Cualquier pequeño problema de calidad se ha debido siempre a los fallos
inevitables que en ocasiones presenta toda máquina, por buena que sea.
Mis agradecimientos también a las diversas instituciones de la Universidad de Valladolid, que
han recibido en ocasión la presión de la demanda a través de incorrectas llamadas telefónicas
solicitando el libro, no siendo ellos los encargados de su distribución; también al Grupo Universitario
de Informática, por su colaboración a todos los niveles.
No puedo decir lo mismo de los funcionarios de Correos: aunque algunos son amables, en
general, el funcionamiento de esa institución es el que cabía esperar de un monopolio no sometido a la
libre competencia en envíos postales ordinarios (y que, por tanto, no tiene la obligación de tratar bien a
sus clientes, porque también volverán mañana). El trato que reciben los clientes no se diferencia mucho
del de los paquetes, y estos son muy expresivos en ocasiones al llegar al destino. Por otro lado, la
cantidad de papeles que hay que rellenar en cada envío, y algunas normas de la empresa (como el
plomo adherido a los paquetes postales) no se han simplificado desde finales del siglo XIX. Tampoco
es comprensible que sólo Argentaria sea aún la única entidad financiera con el privilegio de gestionar
las denominadas Cuentas Corrientes Postales. Además de que el servicio de correos es caro en la
realidad (esto es, cuando se incluye lo que pagamos en impuestos para cubrir las pérdidas de la
compañía) se mantiene el viejo vicio de indexar las tarifas anuales (aumento del 8% en 1997, cuando
hay un 2% de inflación nacional).
Sin embargo, he de reconocer que la fiabilidad de Correos (entendida en cuanto a paquetes que
llegan a su destino o en su defecto vuelven por motivo de dirección incorrecta) es próxima al 100%: los
envíos no suelen perderse, al menos los de los reembolsos. En puntualidad, aunque hay extremos de
gran aleatoriedad (desde paquetes que llegan en tres días a un pueblo perdido en la otra punta del país, a
los que tardan quince en ir de Valladolid a Madrid) el tiempo promedio podría aproximarse, aunque por
debajo, a lo que afirma la empresa.
Ciriaco García de Celis
PRÓLOGO
DE LA TERCERA EDICIÓN (1994)
Ha pasado un año desde la publicación de la primera edición de esta obra. Desde entonces, ha
continuado la expansión de los interfaces gráficos de usuario y los sistemas operativos avanzados para
PC. Sin embargo, pese a que la programación continúa alejándose cada vez más del bajo nivel de las
máquinas, los programadores de sistemas en el entorno del PC siguen existiendo y son muchos más que
los que trabajan para las empresas punteras en el desarrollo de los sistemas operativos. Los ordenadores
compatibles poseen numerosas aplicaciones en el campo industrial, para las que es conveniente un
conocimiento elevado del funcionamiento interno del ordenador en general y del MS-DOS en
particular. Para aquellas personas que necesitan comprender el funcionamiento de un ordenador, las
máquinas compatibles constituyen una interesante oportunidad y punto de partida. Este libro pretende
cubrir una importante laguna en la bibliografía disponible actualmente sobre la programación a nivel de
sistemas de los ordenadores compatibles.
Respecto a la primera edición, se han incrementado los contenidos en una proporción
equivalente al 20% de lo que ya existía, corrigiéndose además algunos errores. Aunque el libro
comience con una introducción a la aritmética binaria que pueda indicar todo lo contrario, se presupone
que el lector tiene unos mínimos conocimientos de informática, al menos un dominio básico del sistema
operativo MS-DOS, siendo más que recomendable conocer algún lenguaje de programación.
Seguidamente se explica el lenguaje ensamblador de la serie 80x86 de Intel separando claramente las
instrucciones de los diversos procesadores, aunque dejando de lado algunas instrucciones del 286 y 386
que se salen del entorno MS-DOS. También se describe la sintaxis del lenguaje ensamblador; sin
embargo, aunque este último aspecto está extensamente documentado, los lectores que no conozcan el
lenguaje ensamblador de ningún microprocesador habrán de trabajar considerablemente leyendo
multitud de listados hasta adquirir la soltura necesaria y, sobre todo, creando los suyos propios. Aunque
sería conveniente describir el lenguaje C, íntimo aliado del ensamblador en la programación de
sistemas, ello se deja por razones de espacio para otras publicaciones.
El libro describe con profundidad la arquitectura de los ordenadores compatibles, de manera
especial en lo referente a la organización interna de la memoria (actualizada hasta el MS-DOS 6.0 y el
DR-DOS 6.0), los discos y el teclado. El apartado de los gráficos se repasa sólo superficialmente, ya
que por sí solo necesitaría de un buen libro más grueso que este. Se dan pistas sobre la manera de
conmutar los modos de vídeo sin alterar el contenido de la pantalla, aspecto que resulta de especial
interés para los programas residentes.
Las memorias extendida XMS y expandida EMS son descritas con cierto detenimiento, dada su
presencia en todos los ordenadores modernos y su importancia.
Existen apéndices que describen todas las funciones del DOS, de la BIOS y del sistema usadas
en las rutinas y programas desarrollados, así como la totalidad de las funciones XMS y EMS. Sin
embargo, no están ni muchísimo menos todas las interrupciones necesarias, por lo que se insta al lector
a conseguir el impresionante fichero de dominio público INTERRUPT.LST, complemento ideal de este
libro (ver bibliografía).
Los programas residentes reciben un tratamiento especialmente profundo: desde los métodos
más eficientes para que detecten su propia presencia en memoria, a las técnicas más avanzadas para
economizar memoria, pasando por el uso de funciones del DOS de manera concurrente al programa
principal, así como técnicas de empleo de memoria extendida y superior para conseguir programas que
usen 0 Kb dentro de los primeros 640 Kb de la máquina y todo ello sin olvidar la convivencia con los
actuales entornos operativos, como Windows, y la posibilidad de ser activados desde pantallas gráficas.
Este libro también trata los controladores de dispositivo o device drivers, desde los dos posibles
enfoques de su uso: bien sea la creación de controladores de dispositivo de caracteres, bien la de nuevas
unidades de disco añadidas a las del sistema; en ambos casos se incluyen ejemplos reales de
controladores completos y comprobados, en particular el ejemplo de disco virtual: un completo ejemplo
de controlador redimensionable que soporta memoria convencional, XMS y EMS.
Existe un capítulo muy próximo al hardware en el que se describen a fondo y sin omisiones
todos los chips del ordenador, para permitir al programador de sistemas un control completo del equipo.
Para asimilar este capítulo hace falta cierta formación previa en los sistemas digitales; sin embargo, los
ejemplos que siguen a la información técnica aclaran las explicaciones previas y pueden ser
aprovechados de manera inmediata incluso sin entender todo lo anterior. Los chips de apoyo al
microprocesador son descritos de manera total: primero, no relacionados con el PC sino como tales
circuitos; después integrándolos en el ordenador y documentando profusamente su uso, con ejemplos
probados. Se consideran el interfaz de periféricos 8255 (útil para averiguar la configuración de los
PC/XT), el temporizador 8253/8254 (para temporización y síntesis de sonido), el controlador de
interrupciones 8259, el controlador de DMA 8237 (para acceso a disco), el controlador de disquetes
765 (acceso directo a los sectores), la controladora de disco duro de los AT (IDE, MFM ó Bus Local);
el controlador del teclado del AT (8042); el UART 8250 (empleado en las comunicaciones serie) y el
reloj de tiempo real MC146818 (configuración de AT y programación de alarmas y temporizaciones).
Los ejemplos en este capítulo experimentan una importante potenciación respecto a la edición anterior;
en particular, en lo relacionado con el controlador de disquetes se puede considerar que la información
vertida es prácticamente casi toda la existente, existiendo pautas suficientes para que el lector cree sus
propios programas copiones, protecciones de disco, formatos de alta capacidad, etc.
Existen también capítulos que describen el funcionamiento y programación de la impresora; sin
entrar en aspectos particulares relativos a los modelos de las diversas marcas, sí se suministra
información común a todas. También se comenta en un capítulo el funcionamiento al más bajo nivel del
ratón, aspecto que habitualmente no suele ser considerado.
Dada la importancia del lenguaje C en la programación en general y en la programación de
sistemas en particular, tanto en la actualidad como durante los próximos años, se incluye un capítulo
que describe la manera de comunicar el ensamblador con el lenguaje C, con objeto de superar las
limitaciones de este lenguaje en los puntos críticos de la programación de sistemas. Este capítulo
requiere un dominio elemental del lenguaje C por parte del lector, aunque probablemente sólo sea útil
para aquellos que lo conocen más o menos.
Resumiendo, el libro pretende reunir en una sola obra la mayoría de la información necesaria
para el programador de sistemas, exponiendo toda la información y no sólo lo imprescindible, sin
olvidos ni omisiones; también se pretende explicar las técnicas más avanzadas de creación de
programas residentes. Este afán de información completa es el responsable del título del libro.
Todos los listados de ejemplo se suponen de dominio público y las rutinas pueden ser incluidas
por los lectores libremente en sus propios programas, aunque en el caso de los programas completos
debe citarse la procedencia y dejar bien claro en las versiones modificadas quién las ha alterado. En
todo caso, pese a que todas las rutinas y programas han sido probados debidamente en un 8088, un 286,
un 386 o un 486 -bajo varios sistemas operativos y con diferentes configuraciones del hardware- el
autor del libro no se responsabiliza de su correcto funcionamiento en todas las circunstancias.
Capítulo I: INTRODUCCIÓN
1.1. - NUMEROS BINARIOS, OCTALES Y HEXADECIMALES.
El sistema de numeración utilizado habitualmente es la base 10; es decir, consta de 10 dígitos (0-9) que podemos colocar en grupos, ordenados de izquierda a derecha y de mayor a menor.
Cada posición tiene un valor o peso de 10n donde n representa el lugar contado por la derecha: 1357 = 1 x 103 + 3 x 102 + 5 x 101 + 7 x 100
Explícitamente, se indica la base de numeración como 135710.
En un ordenador el sistema de numeración es binario -en base 2, utilizando el 0 y el 1- hecho propiciado por ser precisamente dos los estados estables en los dispositivos digitales que componen una computadora.
Análogamente a la base 10, cada posición tiene un valor de 2n donde n es la posición contando desde la derecha y empezando por 0:
1012 = 1 x 22 + 0 x 21 + 1 x 20
Además, por su importancia y utilidad, es necesario conocer otros sistemas de numeración como pueden ser el octal (base 8) y el hexadecimal (base 16). En este último tenemos, además de los números del 0 al 9, letras -normalmente en mayúsculas- de la A a la F.
Llegar a un número en estos sistemas desde base 2 es realmente sencillo si agrupamos las cifras binarias de 3 en 3 (octal) o de 4 en 4 (hexadecimal):
Base 2 a base 8: 101 0112 = 538 Base 2 a base 16: 0010 10112 = 2B16 A la inversa, basta convertir cada dígito octal o hexadecimal en binario:
Base 8 a base 2: 248 = 010 1002 Base 16 a base 2: 2416 = 0010 01002
De ahora en adelante, se utilizarán una serie de sufijos para determinar el sistema de numeración empleado:
╔══════════╤══════════╤══════════════╗ ║ Sufijo │ Base │ Ejemplos ║
╟──────────┼──────────┼──────────────╢ ║ b │ 2 │ 01101010b ║ ║ o,q │ 8 │ 175o ║ ║ d │ 10 │ 789d ║ ║ h │ 16 │ 6A5h ║ ╚══════════╧══════════╧══════════════╝
1.2. - CAMBIO DE BASE.
Pese a que las conversiones entre base 2 y base 8 y 16 son prácticamente directas, existe un sistema general para realizar el cambio de una base a otra. El paso de cualquier base a base 10 lo vimos antes:
6A5h = 6 x 162
+ 10 x 161
+ 5 x 160
Inversamente, si queremos pasar de base 10 a cualquier otra habrá que realizar sucesivas divisiones por la base y tomar los restos:
1234 │ 16 └─────────
114 77 │ 16 1234d = 4D2h 2 └─────────
13 4
donde 4 es el último cociente (menor que la base) y los restantes dígitos son los restos en orden inverso.
1.3. - ESTRUCTURA ELEMENTAL DE LA MEMORIA.
1.3.1. - BIT.
Toda la memoria del ordenador se compone de dispositivos electrónicos que pueden adoptar únicamente dos estados, que representamos matemáticamente por 0 y 1. Cualquiera de estas unidades de información se denomina BIT, contracción de «binary digit» en inglés.
1.3.2. - BYTE.
Cada grupo de 8 bits se conoce como byte u octeto. Es la unidad de almacenamiento en memoria, la cual está constituida por un elevado número de posiciones que almacenan bytes. La cantidad de memoria de que dispone un sistema se mide en Kilobytes (1 Kb = 1024 bytes), en Megabytes (1 Mb = 1024 Kb), Gigabytes (1 Gb = 1024 Mb), Terabytes (1 Tb = 1024 Gb) o Petabytes (1 Pb = 1024 Tb).
Los bits en un byte se numeran de derecha a izquierda y de 0 a 7, correspondiendo con los exponentes de las potencias de 2 que reflejan el valor de cada posición. Un byte nos permite, por tanto, representar 256 estados (de 0 a 255) según la combinación de bits que tomemos.
1.3.3. - NIBBLE.
Cada grupo de cuatro bits de un byte constituye un nibble, de forma que los dos nibbles de un byte se llaman nibble superior (el compuesto por los bits 4 a 7) e inferior (el compuesto por los bits 0 a 3). El nibble tiene gran utilidad debido a que cada uno almacena un dígito hexadecimal:
╔═════════╤═════════╤═════════╦═════════╤═════════╤═════════╗ ║ Binario │ Hex. │ Decimal ║ Binario │ Hex. │ Decimal ║
╟─────────┼─────────┼─────────╫─────────┼─────────┼─────────╢ ║ 0000 │ 0 │ 0 ║ 1000 │ 8 │ 8 ║ ║ 0001 │ 1 │ 1 ║ 1001 │ 9 │ 9 ║ ║ 0010 │ 2 │ 2 ║ 1010 │ A │ 10 ║ ║ 0011 │ 3 │ 3 ║ 1011 │ B │ 11 ║ ║ 0100 │ 4 │ 4 ║ 1100 │ C │ 12 ║ ║ 0101 │ 5 │ 5 ║ 1101 │ D │ 13 ║
║ 0110 │ 6 │ 6 ║ 1110 │ E │ 14 ║
║ 0111 │ 7 │ 7 ║ 1111 │ F │ 15 ║
╚═════════╧═════════╧═════════╩═════════╧═════════╧═════════╝
1.4. - OPERACIONES ARITMÉTICAS SENCILLAS EN BINARIO.
Para sumar números, tanto en base 2 como hexadecimal, se sigue el mismo proceso que en base 10: Podemos observar que la suma se desa-
1010 1010b rrolla de la forma tradicional; es decir: + 0011 1100b sumamos normalmente, salvo en el caso de
────────────── 1 + 1 = 102 , en cuyo caso tenemos un aca-
1110 0110b rreo de 1 (lo que nos llevamos).
1.5. - COMPLEMENTO A DOS.
En general, se define como valor negativo de un número el que necesitamos sumarlo para obtener 00h, por ejemplo:
FFh Como en un byte solo tenemos dos nibbles, es + 01h decir, dos dígitos hexadecimales, el resultado es ────── 0 (observar cómo el 1 más significativo subrayado 100h es ignorado). Luego FFh=-1. Normalmente, el bit 7 se considera como de signo y, si está activo (a 1) el número es negativo.
Por esta razón, el número 80h, cuyo complemento a dos es él mismo, se considera negativo (-128) y el número 00h, positivo. En general, para hallar el complemento a dos de un número cualquiera basta con calcular primero su complemento a uno, que consiste en cambiar los unos por ceros y los ceros por unos en su notación binaria; a continuación se le suma una unidad para calcular el complemento a dos. Con una calculadora, la operación es más sencilla: el complemento a dos de un número A de n bits es 2n
-A.
Otro factor a considerar es cuando se pasa de operar con un número de cierto tamaño (ej., 8 bits) a otro mayor (pongamos de 16 bits). Si el número es positivo, la parte que se añade por la izquierda son bits a 0. Sin embargo, si era negativo (bit más significativo activo) la parte que se añade por la izquierda son bits a 1. Este fenómeno, en cuya demostración matemática no entraremos, se puede resumir en que el bit más significativo se copia en todos los añadidos: es lo que se denomina la extensión del signo: los dos siguientes números son realmente el mismo número (el -310): 11012 (4 bits) y 111111012 (8 bits).
1.6. - AGRUPACIONES DE BYTES.
╔═══════════════════════╤════════════════════════════════════╗ ║ Tipo │ Definición ║
╟───────────────────────┼────────────────────────────────────╢ ║ Palabra │ 2 bytes contiguos ║
║ Doble palabra │ 2 palabras contiguas (4 bytes) ║
║ Cuádruple palabra │ 4 palabras contiguas (8 bytes) ║
║ Párrafo │ 16 bytes ║
║ Página │ 256 bytes, 16 Kb, etc. ║
║ Segmento │ 64 Kbytes ║
╚═══════════════════════╧════════════════════════════════════╝
1.7. - REPRESENTACIÓN DE LOS DATOS EN MEMORIA.
╔═══════════╤═══════════════════════════════╗ ║ Tipo │ Sin signo ║
╟───────────┼───────────────────────────────╢ ║ 1 byte │ 255 ║ ║ 2 bytes │ 65.535 ║ ║ 4 bytes │ 4.294.967.295 ║ ║ 8 bytes │ 18.446.744.073.709.551.615 ║ ╚═══════════╧═══════════════════════════════╝ ╔════════════╤═════════════════════════════╤═══════════════════════════════╗ ║ Tipo │ Positivo │ Negativo ║
╟────────────┼─────────────────────────────┼───────────────────────────────╢ ║ 1 byte │ 127 │ -128 ║ ║ 2 bytes │ 32.767 │ -32.768 ║ ║ 4 bytes │ 2.147.483.647 │ -2.147.483.648 ║ ║ 8 bytes │ 9.223.372.036.854.775.807 │ -9.223.372.036.854.775.808 ║ ╚════════════╧═════════════════════════════╧═══════════════════════════════╝
Los números binarios de más de un byte se almacenan en la memoria en los procesadores de Intel en orden inverso: 01234567h se almacenaría: 67h, 45h, 23h, 01h.
1.7.2. - NUMEROS BINARIOS CODIFICADOS EN DECIMAL (BCD).
Consiste en emplear cuatro bits para codificar los dígitos del 0 al 9 (desperdiciando las seis combinaciones que van de la 1010 a la 1111). La ventaja es la simplicidad de conversión a/de base 10, que resulta inmediata. Los números BCD pueden almacenarse desempaquetados, en cuyo caso cada byte contiene un dígito BCD (Binary-Coded Decimal); o empaquetados, almacenando dos dígitos por byte (para construir los números que van del 00 al 99). La notación BCD ocupa cuatro bits -un nibble- por cifra, de forma que en el formato desempaquetado el nibble superior siempre es 0.
1.7.3. - NUMEROS EN PUNTO FLOTANTE.
Son grupos de bytes en los que una parte se emplea para guardar las cifras del número (mantisa) y otra para indicar la posición del punto flotante (exponente), de modo equivalente a la notación científica. Esto permite trabajar con números de muy elevado tamaño -según el exponente- y con una mayor o menor precisión en función de los bits empleados para codificar la mantisa.
1.7.4. - CÓDIGO ASCII.
El código A.S.C.I.I. (American Standard Code for Information Interchange) es un convenio adoptado para asignar a cada carácter un valor numérico; su origen está en los comienzos de la Informática tomando como muestra algunos códigos de la transmisión de información de radioteletipo. Se trata de un código de 7 bits con capacidad para 128 símbolos que incluyen todos los caracteres alfanuméricos del inglés, con símbolos de puntuación y algunos caracteres de control de la transmisión.
Con posterioridad, con la aparición de los microordenadores y la gran expansión entre ellos de los IBM-PC y compatibles, la ampliación del código ASCII realizada por esta marca a 8 bits, con capacidad para 128 símbolos adicionales, experimenta un considerable auge, siendo en la actualidad muy utilizada y recibiendo la denominación oficial de página de códigos 437 (EEUU). Se puede consultar al final de este libro. Es habitualmente la única página soportada por las BIOS de los PC. Para ciertas nacionalidades se han diseñado otras páginas específicas que requieren de un software externo. En las lenguas del estado español y en las de la mayoría de los demás países de la UE, esta tabla cubre todas las necesidades del idioma.
Se realizan a nivel de bit y pueden ser de uno o dos operandos:
╔═════╤═════════╗ ╔════════════╤══════════════╤═════════════╤════════════╗
║ x │ NOT (x) ║ ║ x y │ x AND y │ x OR y │ x XOR y ║
╟─────┼─────────╢ ╟────────────┼──────────────┼─────────────┼────────────╢ ║ 0 │ 1 ║ ║ 0 0 │ 0 │ 0 │ 0 ║ ║ 1 │ 0 ║ ║ 0 1 │ 0 │ 1 │ 1 ║ ╚═════╧═════════╝ ║ 1 0 │ 0 │ 1 │ 1 ║ ║ 1 1 │ 1 │ 1 │ 0 ║ ╚════════════╧══════════════╧═════════════╧════════════╝
Capítulo II: ARQUITECTURA E HISTORIA DE LOS MICROORDENADORES
El ensamblador es un lenguaje de programación que, por la traducción directa de los mnemónicos a instrucciones maquina, permite realizar aplicaciones rápidas, solucionando situaciones en las que los tiempos de ejecución constituye el factor principal para que el proceso discurra con la suficiente fluidez. Esta situación, que indudablemente sí influye sobre la elección del lenguaje de programación a utilizar en el desarrollo de una determinada rutina, y dada la aparición de nuevos compiladores de lenguajes de alto nivel que optimizan el código generado a niveles muy próximos a los que un buen programador es capaz de realizar en ensamblador, no es la única razón para su utilización.
Es sobradamente conocido que los actuales sistemas operativos son programados en su mayor parte en lenguajes de alto nivel, especialmente C, pero siempre hay una parte en la que el ensamblador se hace casi insustituible bajo DOS y es la programación de los drivers para los controladores de dispositivos, relacionados con las tareas de más bajo nivel de una máquina, fundamentalmente las operaciones de entrada/salida en las que es preciso actuar directamente sobre los demás chips que acompañan al microprocesador. Por ello y porque las instrucciones del lenguaje ensamblador están íntimamente ligadas a la máquina, vamos a realizar primero un somero repaso a la arquitectura interna de un microordenador.
2.1. - ARQUITECTURA VON NEWMAN.
Centrándonos en los ordenadores sobre los que vamos a trabajar desarrollaré a grandes rasgos la arquitectura Von Newman que, si bien no es la primera en aparecer, sí que lo hizo prácticamente desde el comienzo de los ordenadores y se sigue desarrollando actualmente. Claro es que está siendo desplazada por otra que permiten una mayor velocidad de proceso, la RISC.
En los primeros tiempos de los ordenadores, con sistemas de numeración decimal, una electrónica sumamente complicada muy susceptible a fallos y un sistema de programación cableado o mediante fichas, Von Newman propuso dos conceptos básicos que revolucionarían la incipiente informática:
a) La utilización del sistema de numeración binario. Simplificaba enormemente los problemas que la implementación electrónica de las operaciones y funciones lógicas planteaban, a la vez proporcionaba una mayor inmunidad a los fallos (electrónica digital).
b) Almacenamiento de la secuencia de instrucciones de que consta el programa en una memoria interna, fácilmente accesible, junto con los datos que referencia. De este forma la velocidad de proceso experimenta un considerable incremento; recordemos que anteriormente una instrucción o un dato estaban codificados en una ficha en el mejor de los casos.
Tomando como modelo las máquinas que aparecieron incorporando las anteriores características, el ordenador se puede considerar compuesto por las siguientes partes:
- La Unidad Central de Proceso, U.C.P., más conocida por sus siglas en inglés (CPU). - La Memoria Interna, MI.
- Unidad de Entrada y Salida, E/S. - Memoria masiva Externa, ME.
están relacionadas entre si:
- La Unidad Central de Proceso (CPU) viene a ser el cerebro del ordenador y tiene por misión efectuar las operaciones aritmético-lógicas y controlar las transferencias de información a realizar.
- La Memoria Interna (MI) contiene el conjunto de instrucciones que ejecuta la CPU en el transcurso de un programa. Es también donde se almacenan temporalmente las variables del mismo, todos los datos que se precisan y todos los resultados que devuelve.
- Unidades de entrada y salida (E/S) o Input/Output (I/O): son las encargadas de la comunicación de la máquina con el exterior, proporcionando al operador una forma de introducir al ordenador tanto los programas como los datos y obtener los resultados.
Como es de suponer, estas tres partes principales de que consta el ordenador deben estar íntimamente conectadas; aparece en este momento el concepto de bus: el bus es un conjunto de líneas que enlazan los distintos componentes del ordenador, por ellas se realiza la transferencia de datos entre todos sus elementos.
Se distinguen tres tipos de bus:
- De control: forman parte de él las líneas que seleccionan desde dónde y hacia dónde va dirigida la información, también las que marcan la secuencia de los pasos a seguir para dicha transferencia.
- De datos: por él, de forma bidireccional, fluyen los datos entre las distintas partes del ordenador.
- De direcciones: como vimos, la memoria está dividida en pequeñas unidades de almacenamiento que contienen las instrucciones del programa y los datos. El bus de direcciones consta de un conjunto de líneas que permite seleccionar de qué posición de la memoria se quiere leer su contenido. También direcciona los puertos de E/S.
La forma de operar del ordenador en su conjunto es direccionar una posición de la memoria en busca de una instrucción mediante el bus de direcciones, llevar la instrucción a la unidad central de proceso -CPU- por medio del bus de datos, marcando la secuencia de la transferencia el bus de control. En la CPU la instrucción se decodifica, interpretando qué operandos necesita: si son de memoria, es necesario llevarles a la CPU; una vez que la operación es realizada, si es preciso se devuelve el resultado a la memoria.
2.2. - EL MICROPROCESADOR.
Un salto importante en la evolución de los ordenadores lo introdujo el microprocesador: se trata de una unidad central de proceso contenida totalmente en un circuito integrado. Comenzaba así la gran carrera en busca de lo más rápido, más pequeño; rápidamente el mundo del ordenador empezó a ser accesible a pequeñas empresas e incluso a nivel doméstico: es el boom de los microordenadores personales. Aunque cuando entremos en la descripción de los microprocesadores objeto de nuestro estudio lo ampliaremos, haré un pequeño comentario de las partes del microprocesador:
- Unidad aritmético-lógica: Es donde se efectúan las operaciones aritméticas (suma, resta, y a veces producto y división) y lógicas (and, or, not, etc.).
- Decodificador de instrucciones: Allí se interpretan las instrucciones que van llegando y que componen el programa.
- Bloque de registros: Los registros son celdas de memoria en donde queda almacenado un dato temporalmente. Existe un registro especial llamado de indicadores, estado o flags, que refleja el estado operativo del microprocesador.
- Bloque de control de buses internos y externos: supervisa todo el proceso de transferencias de información dentro del microprocesador y fuera de él.
La trepidante evolución del mundo informático podría provocar que algún recién llegado a este libro no sepa exactamente qué diferencia a un ordenador "AT" del viejo "XT" inicial de IBM. Algunos términos manejados en este libro podrían ser desconocidos para los lectores más jóvenes. Por ello, haremos una pequeña introducción sobre la evolución de los ordenadores personales, abarcando toda la historia (ya que no es muy larga).
La premonición.
En 1973, el centro de investigación de Xerox en Palo Alto desarrolló un equipo informático con el aspecto externo de un PC personal actual. Además de pantalla y teclado, disponía de un artefacto similar al ratón; en general, este aparato (denominado Alto) introdujo, mucho antes de que otros los reinventaran, algunos de los conceptos universalmente aceptados hoy en día. Sin embargo, la tecnología del momento no permitió alcanzar todas las intenciones. Alguna innovación, como la pantalla vertical, de formato similar a una hoja de papel (que desearían algunos actuales internautas para los navegadores) aún no ha sido adoptada: nuestros PC's siguen pareciendo televisores con teclas, y los procesadores de textos no muestran legiblemente una hoja en vertical completa incluso en monitores de 20 pulgadas.
El microprocesador.
El desarrollo del primer microprocesador por Intel en 1971, el 4004 (de 4 bits), supuso el primer paso hacia el logro de un PC personal, al reducir drásticamente la circuitería adicional necesaria. Sucesores de este procesador fueron el 8008 y el 8080, de 8 bits. Ed Roberts construyó en 1975 el Altair 8800 basándose en el 8080; aunque esta máquina no tenía teclado ni pantalla (sólo interruptores y luces), era una arquitectura abierta (conocida por todo el mundo) y cuyas tarjetas se conectaban a la placa principal a través de 100 terminales, que más tarde terminarían convirtiéndose en el bus estándar S-100 de la industria.
El Apple-I apareció en 1976, basado en el microprocesador de 8 bits 6502, en aquel entonces un recién
aparecido aunque casi 10 veces más barato que el 8080 de Intel. Fue sucedido en 1977 por el Apple-II. No olvidemos los rudimentos de la época: el Apple-II tenía un límite máximo de 48 Kbytes de memoria. En el mismo año, Commodore sacó su PET con 8 Kbytes. Se utilizaban cintas de casete como almacenamiento, aunque comenzaron a aparecer las unidades de disquete de 5¼. Durante finales de los 70 aparecieron muchos otros ordenadores, fruto de la explosión inicial del microprocesador.
Los micros de los 80.
En 1980, Sir Clive Sinclair lanzó el ZX-80, seguido muy poco después del ZX-81. Estaban basados en un microprocesador sucesor del 8085 de Intel: el Z80 (desarrollado por la empresa Zilog, creada por un ex-ingeniero de Intel). Commodore irrumpió con sus VIC-20 y, posteriormente, el Commodore 64, basados aún en el 6502 y, este último, con mejores posibilidades gráficas y unos 64 Kb de memoria. Su competidor fue el ZX-Spectrum de Sinclair, también basado en el Z80, con un chip propio para gestión de gráficos y otras tareas, la ULA, que permitió rebajar su coste y multiplicó su difusión por europa, y en particular por España. Sin embargo, todos los ordenadores domésticos de la época, como se dieron en llamar, estaban basados en procesadores de 8 bits y tenían el límite de 64 Kb de memoria. Los intentos de rebasar este límite manteniendo aún esos chips por parte de la plataforma MSX (supuesto estándar mundial con la misma suerte que ha corrido el Esperanto) o los CPC de Amstrad, de poco sirvieron.
El IBM PC.
Y es que IBM también fabricó su propio ordenador personal con vocación profesional: el 12 de agosto de 1981 presentó el IBM PC. Estaba basado en el microprocesador 8088, de 16 bits, cuyas instrucciones serán las que usemos en este libro, ya que todos los procesadores posteriores son básicamente (en MS-DOS) versiones mucho más rápidas del mismo. El equipamiento de serie consistía en 16 Kbytes de memoria ampliables a 64 en la placa base (y a 256 añadiendo tarjetas); el almacenamiento externo se hacía en cintas de casete, aunque
pronto aparecieron las unidades de disco de 5¼ pulgadas y simple cara (160/180 Kb por disco) o doble cara (320/360 Kb). En 1983 apareció el IBM PC-XT, que traía como novedad un disco duro de 10 Mbytes. Un año más tarde aparecería el IBM PC-AT, introduciendo el microprocesador 286, así como ranuras de expansión de 16 bits (el bus ISA de 16 bits) en contraposición con las de 8 bits del PC y el XT (bus ISA de 8 bits), además incorporaba un disco duro de 20 Mbytes y disquetes de 5¼ pero con 1.2 Mbytes.
En general, todos los equipos con procesador 286 o superior pueden catalogarse dentro de la categoría AT; el término XT hace referencia al 8088/8086 y similares. Finalmente, por PC (a secas) se entiende cualquiera de ambos; aunque si se hace distinción entre un PC y un AT en la misma frase, por PC se sobreentiende un XT, menos potente. El término PC ya digo, no obstante, es hoy en día mucho más general, referenciando habitualmente a cualquier ordenador personal.
Alrededor del PC se estaba construyendo un imperio de software más importante que el propio hardware: estamos hablando del sistema operativo PC-DOS. Cuando aparecieron máquinas compatibles con el PC de IBM, tenían que respetar la compatibilidad con ese sistema, lo que fue sencillo (ya que Microsoft, le gustara o no a IBM, desarrolló el MS-DOS, compatible con el PC-DOS pero que no requería la BIOS del ordenador original, cuyo copyright era de IBM). Incluso, el desarrollo de los microprocesadores posteriores ha estado totalmente condicionado por el MS-DOS. [Por cierto, la jugada del PC-DOS/MS-DOS se repetiría en alguna manera pocos años después con el OS/2-Windows].
A partir de 1986, IBM fue paulatinamente dejando de tener la batuta del mercado del PC. La razón es que la propia IBM tenía que respetar la compatibilidad con lo anterior, y en ese terreno no tenía más facilidades para innovar que la competencia. El primer problema vino con la aparición de los procesadores 386: los demás fabricantes se adelantaron a IBM y lanzaron máquinas con ranuras de expansión aún de 16 bits, que no permitían obtener todo el rendimiento. IBM desarrolló demasiado tarde, en 1987, la arquitectura Microchannel, con bus de 32 bits pero cerrada e incompatible con tarjetas anteriores (aunque se desarrollaron nuevas tarjetas, eran caras) y la incluyó en su gama de ordenadores PS/2 (alguno de cuyos modelos era aún realmente ISA). La insolente respuesta de la competencia fue la arquitectura EISA, también de 32 bits pero compatible con la ISA anterior.
Otro ejemplo: si IBM gobernó los estándares gráficos hasta la VGA, a partir de ahí sucedió un fenómeno similar y los demás fabricantes se adelantaron a finales de los 80 con mejores tarjetas y más baratas; sin embargo, se perdió la ventaja de la normalización (no hay dos tarjetas superiores a la VGA que funcionen igual).
EISA también era caro, así que los fabricantes orientales, cruzada ya la barrera de los años 90, desarrollaron con la norma VESA las placas con bus local (VESA Local Bus); básicamente es una prolongación de las patillas de la CPU a las ranuras de expansión, lo que permite tarjetas rápidas de 32 bits pero muy conflictivas entre sí. Esta arquitectura de bus se popularizó mucho con los procesadores 486. Sin embargo, al final el estándar que se ha impuesto ha sido el propuesto por el propio fabricante de las CPU: Intel, con su bus PCI, que con el Pentium se ha convertido finalmente en el único estándar de bus de 32 bits. Estas máquinas aún admiten no obstante las viejas tarjetas ISA, suficientes para algunas aplicaciones de baja velocidad (modems,... etc).
La evolución del MS-DOS.
Una manera sencilla de comprender la evolución de los PC es observar la evolución de las sucesivas versiones del DOS y los sistemas que le han sucedido.
En 1979, Seatle Computer necesitaba apoyar de alguna manera a sus incipientes placas basadas en el
8086. Como Digital Research estaba tardando demasiado en convertir el CP/M-80 a CP/M-86, desarrolló su propio sistema: el QDOS 0.1, que fue presentado en 1980. Antes de finales de año apareció QDOS 0.3.
Bill Gates, dueño de Microsoft, de momento sólo poseía una versión de lenguaje BASIC para 8086 no orientada a ningún sistema operativo particular, que le gustó a algún directivo de IBM. Bill Gates ya había