Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo La arquitectura del 8086/8088 Repasamos aquí la arquitectura de un PC. Para más información sobre lo aquí expuesto se puede consultar [PA01] y los capítulos iniciales de [Tej01], [Rod00] y [Nor01]. Anatomía del PC A grandes rasgos, podríamos decir que todos los miembros de la familia PC constan de un procesador, chips de memoria y varios chips inteligentes o programables (que controlan dispositivos externos, como la unidad de disco o el monitor, o ayudan al microprocesador a realizar sus tareas). Todos los componentes del circuito principal, están situados en la placa principal o placa base. Otros elementos importantes están situados en placas de expansión, que pueden ser conectadas a la placa principal. El microprocesador1 o unidad central de proceso (CPU, Central Process Unit) controla las operaciones básicas del ordenador, enviando y recibiendo señales de control a través de un grupo de caminos electrónicos llamados bus. A grandes rasgos, puede decirse que un bus es un conjunto de unos pequeños cables que conducen bits de información. El número de “cables” que forman el bus se denomina ancho de banda del bus. Localizadas a lo largo del bus, están las puertas de entrada y salida (E/S ó I/O), que conectan la memoria y los chips de apoyo al bus (CTR I/O, controladores de E/S). Los datos pasan a través de estas puertas de E/S mientras viajan desde y hasta la CPU y otras partes Gráficamente, el esquema básico de un PC se puede resumir de este modo: Esquema de los componentes hardware básicos del PC. 1 Para más información sobre procesadores, consultar [SP00] 1 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo Como se observa, hay seis componentes básicos2: 1. Oscilador de reloj: es el encargado de dar un ritmo de funcionamiento al procesador y a toda la circutería en general; por lo tanto, determina la cantidad de instrucciones que el procesador puede ejecutar por segundo. 2. CPU: Es el microcircuito al cual entran las instrucciones de código máquina y donde las mismas son procesadas (ejecutadas). 3. Memoria: Está formada por una serie de chips donde se almacena toda la información del sistema, lo cual incluye tanto al código (instrucciones) como los datos de cualquier tipo. 4. Bus de datos: Es el bus por donde se mueve la información digital que circula por todo el sistema (memoria, puertos...), desplazándose principalmente entre la memoria y la CPU, y viceversa. Este bus es de 16 bits en el 8086 (8 bits en el 8088 y 32 bits en 80386 y 80486). 5. Bus de direcciones: Es el bus usado por la CPU para indicar a la memoria la posición en la que está la información a la que se quiere acceder (ya sea para leerla o para escribir en ella). Una vez se haya accedido a esa posición en la memoria, ésta enviará su contenido a través del mencionado bus de datos. El bus de direcciones posee 20 bits de ancho de banda, por lo que se pueden indicar 220 = 1.048.576 posiciones de memoria distintas. 6. Bus de control: Este bus es el encargado de indicar al sistema tanto el tipo de información que circula por el bus de datos en cada momento, como de sincronizar las señales que controlan el funcionamiento de la circutería del sistema. Algunos de estos componentes se desarrollarán más ampliamente a continuación. El microprocesador El microprocesador o unidad central de proceso (CPU, Central Process Unit) es el chip que ejecuta los programas. Lleva a cabo una gran variedad de cálculos, comparaciones numéricas y transferencia de datos como respuesta a las peticiones de los programas almacenados en memoria. 2 En [Nor01] aparecen de forma muy detallada los esquemas de las placas de diferentes ordenadores y una descripción muy completa de cada uno de sus componentes. 2 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo Así, pues, la unidad central de proceso es el conjunto formado por la unidad control, la unidad de proceso (o unidad aritmético lógica, ALU) y los registros. Figura 1.2. Esquema básico de una CPU La unidad de control es la que gobierna todo el funcionamiento del ordenador. Controla, paso a paso, la ejecución de las instrucciones que se encuentran en memoria central y genera las órdenes necesarias para el funcionamiento de la unidad de proceso y de los canales. Además, gobierna también la lectura y escritura de instrucciones y datos de la memoria central. La unidad de proceso (ALU) es la que ejecuta las operaciones aritméticas y lógicas. Los registros son dispositivos de un ordenador para el almacenamiento temporal de datos. Ambos se desarrollarán más ampliamente a continuación. El microprocesador 8086, que es el que se va a considerar en este trabajo, es un microprocesador de 16 bits que controla los ordenadores personales estándar de IBM. El 8086 difiere del 8088 solamente en un detalle: utiliza un bus de datos de 16 bits en vez del bus de 8 bits del 8088. A excepción de esa diferencia, se les considera prácticamente idénticos. Por ello, cada vez que se haga referencia a uno de ellos, se pondrá 8086/8088 para indicar que esa referencia es válida para ambos microprocesadores. Los registros de la CPU 3 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo Para ayudar al funcionamiento de las instrucciones, para poder manejar variables en memoria y para su propio funcionamiento, el microprocesador dispone de una serie de “variables” internas de nombres fijos que son los registros internos. En total hay 14 de estos registros, como se puede observar en la figura 1.3, cada uno de los cuales está pensado principalmente para alguna función concreta. Figura 1.3. Registros internos de la CPU. A continuación se detallan cada uno de estos registros, divididos según áreas de funcionalidad: Registros de almacenamiento temporal - AX (registro Acumulador): Este registro es usado, sobre todo, en operaciones aritméticas como primer operando y también como registro de propósito general a disposición del programador. - BX (registro Base): Se usa principalmente para indicar posiciones de memoria (offset). - CX (registro Contador): Este registro se usa siempre que se necesite un contador en operaciones repetitivas y bucles. - DX (registro Dato): Se usa como registro auxiliar en operaciones aritméticas y como contenedor de datos a la hora de usar instrucciones de comunicación de puertos. Estos cuatro registros, como todos los restantes, son de 16 bits, pero para permitir la realización de operaciones de tipo byte (8 bits) cada uno de estos cuatro registros está dividido en dos subregistros de 8 bits a los que se puede acceder de forma independiente (como se observa en la figura 1.2) . Así, por ejemplo, los 8 bits inferiores de AX se llaman AL (L de low, 4 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo bajo) y los 8 superiores AH (H de high, alto). En consecuencia, BX, CX y DX se dividen en BH/BL, CH/CL y DH/DL respectivamente. De esta forma se tiene que todas las instrucciones ensamblador pueden operar con datos de 8 y 16 bits según lo que se precise. En los demás registros esta subdivisión no es posible. Registros de segmento Son cuatro registros de 16 bits usados para indicar direcciones de memoria (los conceptos de segmento y desplazamiento se explicarán en el apartado siguiente): - CS (Code Segment): Este registro es usado por el procesador, junto con el registro IP, para conocer dónde está la instrucción actual que está siendo ejecutada. - DS (Data Segment): Se usa para indicar dónde están todos los datos del programa en ejecución. - SS (Stack Segment): En este registro se indica al procesador dónde está la zona de memoria que se usa como segmento de pila. - ES (Extra Segment): Es el registro que referencia al segmento extra, y se usa como apuntador de memoria auxiliar en operaciones complejas donde se necesitan dos punteros de datos simultáneos. Registros de la pila La pila es un área de memoria importante. Tiene, en vez de uno, dos registros que se usan como desplazamiento (offset) para apuntar su contenido. Se usan como complemento al registro SS y son: - SP (Stack Pointer): Es el registro que se reserva el procesador para uso propio en instrucciones de manipulación de la pila. - BP (Base Pointer): Se usa como registro auxiliar. Registros índices. Se utilizan como desplazamientos complementarios para DS y ES a la hora de indicar la posición donde se encuentran los datos a los que se desea acceder. Son: - SI (Source index): Se usa como puntero origen en operaciones de desplazamiento de datos entre dos zonas de memoria. - DI (Destination index). Se usa como destino en operaciones de desplazamiento de datos. 5 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo Registros de instrucción: Sólo hay uno, el registro IP (Instruction Pointer), es usado por la CPU para conocer la posición relativa a la base CS donde se encuentra la instrucción que se está ejecutando actualmente. Este registro no puede ser modificado directamente por parte del programador. Este puntero cambia su contenido automáticamente cada vez que se ejecuta una instrucción o cuando se salta a otro punto del programa mediante una instrucción de salto. Registro de Banderas: Este registro es usado para tener el control de estado y control de las operaciones. La mayoría de sus 16 bits se utiliza para representar un estado concreto: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CF -- PF -- AF -- ZF SF TF IF DF OF -- -- -- -- Figura 1.4. Estructura del registro de banderas. - Bit 0 - CF (Carry Flag): Es la bandera de acarreo. Se pone a 1 cuando se produce un resultado con acarreo tras una operación aritmética. - Bit 1: No usado. - Bit 2 - PF (Parity Flag): Cuando está a 1, indica que hay un número par de bits activos. - Bit 3: No usado. - Bit 4 - AF (Auxiliar Flag): Se usa como bandera auxiliar. Se pone a 1 cuando hay necesidad de realizar ajustes tras una operación de tipo BCD. - Bit 5: No usado. - Bit 6 - ZF (Zero Flag): Indica si se ha producido un resultado cero o una comparación con operadores iguales. - Bit 7 - SF (Sign Flag): Indica si se ha producido un resultado negativo o comparación menor. - Bit 8 - TF (Trap Flag): Es la bandera de atrape, usada en procesos de depuración de código. - Bit 9 - IF (Interrupt Flag): Si está a 1, indica que está permitida la generación de interrupciones hardware que generan algunos periféricos, como la que realiza el teclado cada vez que una tecla es pulsada. 6 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo - Bit 10 - DF (Direction Flag): Indica a la CPU hacia donde se desplazan los punteros relativos en operaciones repetitivas de cadenas de datos. - Bit 11 - OF (Overflow Flag): Indica si se ha producido un desbordamiento aritmético. - Bit 12 al 15: No usados. La ALU La unidad aritmético-lógica es el segundo principal componente de la unidad central de proceso. Se encarga de realizar las operaciones aritméticas y lógicas con los datos que recibe, siguiendo órdenes de la unidad de control. Las operaciones que realiza la ALU se pueden agrupar en las siguientes categorías: • Operaciones artiméticas, tales como suma, resta, multiplicación y división. • Operaciones de lógica binaria, tales como and, or, xor, not ... • Operaciones de desplazamientos y rotaciones. • Operaciones de transformación de operandos, tales como extensión de signo, transformación a otro formato de numeración, etc. La memoria en un 8086/8088 La memoria RAM de un ordenador es utilizada para almacenar programas o datos con los que el procesador trabaja. Todos los ordenadores necesitan memoria para almacenar programas e información, así como para cargar y ejecutar los programas. Por lo general, cuanto más compleja es la tarea que se desea realizar, más memoria necesita el ordenador. Direccionamiento de la memoria Como ya se ha comentado anteriormente, todos los programas y datos se cargan en localidades de memoria específicas determinadas por sus direcciones. Esa información es almacenada como una secuencia de bytes de manera que cada uno de ellos tiene un número asociado correspondiente al lugar que ocupan. A ese número se lo denomina dirección de memoria. Dado que el 8086/8088 tiene una longitud de palabra de direcciones de 20-bits es posible direccionar hasta 1.048.576 (= 210) localidades distintas de memoria, es decir, podemos almacenar hasta 1Mbyte de información. Sin embargo, la CPU sólo procesa palabras de 16 bits en sus registros de direcciones, como ya se ha visto en los apartados anteriores, y las direcciones de memoria son de 20 bits, por lo que una dirección no cabe en un registro. 7 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo Por lo tanto, en principio, teóricamente sólo se podría acceder hasta el byte número 65.535 (216, el número mayor posible de 16 bits) contando a partir del inicio, que es el byte 0. Para solucionar este inconveniente, se ideó el dividir la dirección de un byte en dos partes, denominadas segmento (o Base) y desplazamiento (u offset), ambos de 16 bits. Adoptada dicha medida, la dirección real de un byte en la memoria es: Dirección real = Valor base x 16 + valor desplazamiento3 De esta forma, se pueden direccionar el millón de bytes y se tiene acceso a toda la memoria del PC (a cada uno de los 1024 Kbytes). La notación más empleada para indicar la dirección de un par segmento – desplazamiento consiste en separar esos dos valores con dos puntos, utilizando notación hexadecimal (por ejemplo: 123h:12h4, representa la dirección con segmento 123h y desplazamiento 12h). Esta forma de direccionar la memoria presentó un pequeño problema que ha entorpecido la elaboración de grandes programas, y no es otro que éste: como ya se ha visto se accede a memoria dando un valor de segmento y otro de desplazamiento; pues bien, si se mantiene el valor del segmento fijo (lo que ocurre en los programas) y se varía únicamente el valor del desplazamiento sólo es posible acceder a 65535 bytes (64 Kbytes), que es el valor máximo alcanzable con los 16 bits del registro de desplazamiento. Con esto, la información máxima que se puede almacenar en la memoria, modificando únicamente el desplazamiento, es de 64 Kb. A esta cantidad de almacenamiento se le denomina segmento de memoria. De este modo, un segmento es un área continua de memoria que puede tener 64K-bytes, que debe comenzar en una localidad de memoria cuya dirección sea límite de 16 bytes (cantidad denominada párrafo) y que puede solaparse con otros segmentos. Así, por ejemplo, la dirección AB00:0012, (es decir, 43776:8 con valores decimales), tiene la misma dirección real que AB01:0002 (es decir, 43777:2 con valores decimales), pues ambas equivalen a la dirección real 700.434 (valor que se obtiene al aplicar la fórmula anterior). Segmentos de memoria de un programa Por lo general, los programas ejecutables disponen de cuatro segmentos (4 zonas de 64 Kbytes): - El segmento de código (tiene como base el contenido del registro CS). En este segmento se encuentran las instrucciones que forman el programa. Para acceder a los datos contenidos en él, se usa el registro IP como desplazamiento. 3 Para obtener 20 bits de direcciones a partir de dos registros de 16, lo que se hace es desplazar uno de ellos (el segmento) 4 bits a la izquierda, añadiendo para ello 4 ceros por la derecha (lo que equivale a multiplicar por 16). Se obtiene así un valor de 20 bits (16 iniciales + 4 ceros añadidos) que no es más que la dirección de inicio del segmento. Para acceder a los datos del segmento, habrá que sumar una cantidad a esa dirección (dicha cantidad es el desplazamiento). Es así como se obtiene la fórmula en cuestión. 4 El sufijo h se refiere a que el número está expresado en la base de numeración hexadecimal o base 16. Ver apéndice F para más información sobre esta notación numérica. 8 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo - El segmento de datos (que tiene como base el registro DS). Contiene los datos que utiliza el programa (variables, etc.) Para acceder a los datos contenidos en él, se suele utilizar los registros SI y DI como desplazamiento. - El segmento de pila5 (con SS como base). En él se desarrolla la pila del programa, utilizada para trasvases temporales de datos, llamadas a funciones, etc. Debe estar presente en todos los programas EXE de forma obligada. Se utiliza el registro SP para acceder a los datos de este segmento. - El segmento extra (con ES como base). Su uso es opcional, y en él se encuentra un segmento definido por el usuario y que, regularmente, contiene datos adicionales. Al igual que ocurre con el segmento de datos, para acceder a los datos contenidos en él, se suelen utilizar los registros SI y DI. El hecho de que haya más de un registro de segmento hace posible crear programas que controlen varios bloques de memoria simultáneos de hasta 64 Kbytes cada uno Mapa de memoria En los 8086/8088, el espacio de direcciones de 1 MB de memoria se encuentra divido en varias áreas funcionales, como se observa en la figura 1.5. Æ E0000h Æ C0000h Æ A0000h Æ FFFFFh Reservada para la ROM BIOS Reservada para ROM instalable Buffers de vídeo Parte transitoria del DOS Área de programas transitorios (programas de usuarios y datos) Parte residente del DOS Æ 00400h Æ 00000h Æ 00500h RAM del sistema Área de Datos para la ROM BIOS y el BASIC Área de datos para la ROM BIOS Vectores de interrupción Figura 1.5. Mapa de memoria de un 8086/8088 Parte del diseño del mapa de memoria del PC y PS/2 es consecuencia del diseño del microprocesador 8086/8088. Por ejemplo, el 8086/8088 mantiene siempre una lista de vectores de interrupción (direcciones de las rutinas de gestión de interrupciones) en los primeros 1024 bytes de RAM. De la misma forma, todos los ordenadores basados en el 9 Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. http://atc.unex.es/gacdl La arquitectura del 8086/8088 Germán Galeano Gil. Juan A. Gómez Puildo 8086/8088 tienen la memoria ROM en lo más alto del megabyte de memoria, debido a que, cuando el 8086/8088 se enciende, ejecuta el programa que comienza en la dirección FFFF0h. Los primeros 64 Kbytes contienen la memoria de acceso aleatorio (RAM). Parte de esta memoria es utilizada por el DOS y el BIOS6 para retener los vectores de interrupción y los datos. Los siguientes 192 Kb están reservados para aplicaciones adicionales del usuario. El resto del mapa de memoria sigue la división general entre la RAM, en la parte baja, y la ROM en la parte alta. Puede haber un máximo de 640 KB de RAM entre las direcciones 00000h y 9FFFFh. Los siguientes bloques de memoria se reservan para la RAM de vídeo (de A0000h a BFFFFh), módulos de ROM instalables (de C0000h a DFFFFh) y ROM permanente (de E0000h a FFFFFh). Divisiones de la memoria Existen varias zonas de memoria RAM en los ordenadores personales: ♦ Memoria Baja: Es la zona en la parte más baja de la memoria base, en donde normalmente se carga el sistema operativo y los controladores de dispositivos. ♦ Memoria Convencional (llamada a veces memoria base) son los primeros 640 Kbytes de memoria del ordenador e incluye a la memoria baja. En esta zona se carga el sistema operativo y los programas de aplicación y sus datos. Con el sistema operativo DOS, los programas de aplicaciones se ejecutan sólo en la memoria convencional. Esta limitación se conoce a veces como barrera de los 640 Kbytes. Las otras zonas de memoria se utilizan de forma limitada, pero sólo con ciertos tipos de hardware ♦ Memoria superior: es toda la memoria direccionada entre los 640 Kbytes y el megabyte. La memoria superior tiene un tamaño de 384 Kbytes. Algunas secciones de la memoria superior se reservan para ser utilizadas por diferentes partes del hardware del ordenador, como el adaptador de vídeo o la ROM BIOS. El hardware del ordenador puede permitir la utilización de algunos de los controladores de gestión de memoria del DOS (EMM386.SYS y HIDOS.SYS). En este caso, se puede utilizar la memoria superior para cargar controladores de dispositivo (como los necesarios para trabajar con un ratón o con una tarjeta de red) que habitualmente se cargan en memoria convencional, dejando así un mayor espacio disponible para los programas de aplicaciones. Es posible también mover a la memoria superior el núcleo del sistema operativo principal. 6 BIOS = Basic Input Output System. Es un conjunto de rutinas básicas grabadas que permiten acceder y manipular los diferentes periféricos de entrada y salida conectados al ordenador. Estas rutinas se encuentran almacenadas en memoria ROM (memoria no volátil). Además de ésa , tiene como función la de iniciar las comprobaciones y cargas del sistema operativo del ordenador cuando éste se conecta. 10