La arquitectura del 8086/8088

Anuncio
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
Descargar