El Intel 8086 y el Intel
8088 (i8086, llamados oficialmente iAPX 86, y i8088) son los primeros
microprocesadores de 16 bits diseñados por Intel. Fueron el inicio y los
primeros miembros de la arquitectura x86. El trabajo de desarrollo para el 8086
comenzó en la primavera de 1976 y fue lanzando al mercado en el verano de 1978.
El 8088 fue lanzado en 1979
El 8086 y el 8088 ejecutan
el mismo conjunto de instrucciones. Internamente son idénticos, excepto que el
8086 tiene una cola de 6 bytes para instrucciones y el 8088 de sólo 4.
Exteriormente se diferencian en que el 8086 tiene un bus de datos de 16 bits y
el del 8088 es de sólo 8 bits, por ello, el 8086 era más rápido. Por otro lado,
el 8088 podía usar menos circuitos lógicos de soporte, lo que permitía la
fabricación de sistemas más económicos.
El 8088 fue el
microprocesador usado para la primera computadora personal de IBM, la IBM PC,
que salió al mercado en agosto de 1981. Hay que tener en cuenta que la mayoría
del hardware, de principios de los 80, era de 8 bits, y más barato. El hardware
de 16 bits era casi inexistente en 1981 y carísimo.
El proyecto 8086 comenzó
en mayo de 1976 y fue pensado originalmente como un sustituto temporal para el
ambicioso y retrasado proyecto del iAPX 432. Era un intento de robar la
atención de los menos retrasados procesadores de 16 y 32 bits de los otros
fabricantes (tales como Motorola, Zilog, y National Semiconductor) y al mismo
tiempo contrarrestar la amenaza del Zilog Z80, que llegó a ser muy exitoso
(diseñado por anteriores empleados de Intel). Por lo tanto, tanto la arquitectura
y el chip físico fueron desarrollados algo rápidamente por un pequeño grupo de
personas, y usando los mismos elementos básicos de la microarquitectura y
técnicas físicas de implementación que fueron empleadas para el ligeramente más
viejo 8085 (y para el cuál el 8086 también funcionaría como una continuación).
Lenguaje de máquina del
Intel 8088. El código de máquina en hexadecimal se resalta en rojo, el
equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria
donde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y
ASCII.
Mercadeado como compatible
a nivel de código fuente, el 8086 fue diseñado de modo que el lenguaje
ensamblador para el 8008, 8080, o el 8085 pudiera ser convertido
automáticamente en (subóptimo) código fuente equivalente del 8086, con poca o
ninguna edición a mano. Para hacer esto posible, el modelo de programación y el
conjunto de instrucciones fueron (flojamente) basados en el 8080. Sin embargo,
el diseño del 8086 fue ampliado para soportar el completo procesamiento de 16
bits, en vez de las bastante básicas capacidades de 16 bits del 8080/8085.
También fueron agregadas
nuevas clases de instrucciones, compatibilidad para enteros con signo,
direccionamiento de base + offset, y las operaciones auto-repetidas fueron
semejantes a las del diseño del Z80,4 pero todas fueron hechas levemente más
generales en el 8086. También fueron agregadas instrucciones que soportaban las
funciones anidadas de la familia de lenguajes ALGOL tales como Pascal y PL/M.
De acuerdo al principal arquitecto Stephen P. Morse, esto fue un resultado de
un acercamiento más centrado en el software que en el que hubo en el diseño de
procesadores anteriores de Intel (los diseñadores tenían experiencia trabajando
con implementaciones de compiladores). Otras mejoras incluyeron instrucciones
de multiplicación y división por microcódigo y una estructura de bus mejor
adaptada para futuros coprocesadores (tales como el 8087 y el 8089) y a los
sistemas de multiprocesadores.
La primera revisión del
conjunto de instrucciones y la arquitectura de alto nivel estaba lista después
de cerca de tres meses,5 y como no fue usada casi ninguna herramienta CAD,
cuatro ingenieros y 12 personas de diagramación estaban simultáneamente
trabajando en el chip.6 El 8086 tomó un poco más de dos años desde la idea
hasta el producto trabajando, lo que fue considerado algo rápido para un
complejo diseño en 1976-1978.
El 8086 fue secuenciado7
usando una mezcla al azar de lógica y microcódigo y fue implementado usando
circuitería de depletion load nMOS con aproximadamente 20.000 transistores
activos (29.000 contando todos los sitios del ROM y el PLA). Pronto fue movido
a un nuevo proceso de fabricación refinado de nMOS llamado HMOS (por High
performance MOS) que Intel desarrolló originalmente para la fabricación de
productos de RAM estática rápida.8 Esto fue seguido por versiones de HMOS-II,
HMOS-III, y, eventualmente, una versión completamente estática de CMOS para
dispositivos energizados con baterías, manufacturados usando los procesos de
CHMOS de Intel.9 El chip original midió 33 mm² y el mínimo tamaño fue de 3.2 µm.
La arquitectura fue
definida por Stephen P. Morse con cierta ayuda y asistencia de Bruce Ravenel
(el arquitecto del 8087) en refinar las revisiones finales. Los diseñadores de
la lógica Jim McKevitt y John Bayliss fueron los ingenieros que encabezaban el
equipo de desarrollo de nivel de hardware,10 y William Pohlma el gerente para
el proyecto. La herencia del 8086 perdura en el conjunto de instrucción básico
de los computadores personales y servidores de hoy; el 8086 también prestó sus
últimos dos dígitos a posteriores versiones extendidas de diseño, tales como el
Intel 286 y el Intel 386, todas las cuales eventualmente serían conocidas como
la familia x86. (Otra referencia es que la identificación de vendedor del PCI
para los dispositivos de Intel es 8086h!)
Unidad de interfaz del bus
y unidad de ejecución
Diagrama de bloque de los
microprocesadores Intel 8086 y 8088.
1 Bloque de registros de
propósito general
2 Bloque de registros de
segmento y registro IP
3 Sumador de direcciones
4 Bus de direcciones
interno
5 Cola de instrucciones (4
bytes para el 8088 y 6 bytes para el 8086)
6 Unidad de control (muy
simplificada)
7 Interfaz del bus
8 Bus de datos interno
9 Unidad aritmético lógica
(ALU)
10, 11, 12 Bus de
direcciones, datos y control externos
El 8086 y el 8088 tienen
internamente dos componentes, la Unidad de Interfaz del Bus y la Unidad de
ejecución (Bus Interface Unit (BIU) y Execution Unit (EU)).
![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Intel_8086_block_scheme.svg/800px-Intel_8086_block_scheme.svg.png)
La Unidad de Ejecución
procesa las instrucciones del CPU. Está conformada por los registros generales,
los registros índice y apuntadores, los flags, la unidad aritmético lógica, y
la lógica de control que maneja todo el proceso para ejecutar las instrucciones.
La Unidad de Interfaz del
Bus maneja la lectura y escritura desde y hacia la memoria y los puertos de
entrada/salida. Está conformada por los registros de segmento, una cola de 4
bytes para instrucciones en el 8088 y de 6 en el 8086, y lógica para controlar
los buses externos del microprocesador.
En la figura de la
derecha, la Unidad de Ejecución se encuentra en la parte de abajo y la Unidad
de Interfaz del Bus está en la parte superior. Las dos están interconectadas
mediante un bus interno.
Registros
Registros de propósito
general
AH
AL AX (Acumulador)
BH
BL BX (Base)
CH
CL CX (Contador)
DH
DL DX (Datos)
Registros índices
SI
Source Index (Índice origen)
DI
Destination Index (Índice Destino)
BP
Base Pointer (Puntero Base)
SP
Stack Pointer (Puntero de Pila)
Registro de Bandera
- -
- - O D
I T S Z
- A - P -
C Flags (Banderas)
Registros de Segmentos
CS
Code Segment (Segmento de Código)
DS
Data Segment (Segmento de Datos)
ES
ExtraSegment (Segmento Extra)
SS
Stack Segment (Segmento de Pila)
Registro apuntador de
instrucciones
IP
Instruction Pointer
Modelo de los registros
Los registros del i8086 e
i8088 se basaron en el diseño del Intel 8080 y el Intel 8085, y de hecho son
compatibles a nivel de lenguaje ensamblador con el i8080. El conjunto de
registros también es similar al del i8080, pero ampliados a 16 bits. Tanto el
i8086 como el i8088 tienen cuatro registros de propósito general de 16 bits,
que también pueden ser accedidos como ocho registros de 8 bits, y tienen cuatro
registros índice de 16 bits (incluyendo el puntero de pila). Los registros de
datos se usan a veces de forma implícita por las instrucciones, haciendo más
difícil la organización de los registros para emplearlos con valores temporales.
Los registros del
procesador, se usan para contener los datos con que se está trabajando puesto
que el acceso a los registros es mucho más rápido que los accesos a memoria. Se
pueden realizar operaciones aritméticas y lógicas, comparaciones, entre otras.
Se pueden hacer estas operaciones con todos los registros excepto los de
segmento, el IP, y los flags.
Registros de Propósito
General
Los registros de propósito
general son el AX, BX, CX, y DX, de 16 bits. Cada uno de ellos se divide en dos
registros de 8 bits, llamados AH y AL, BH y BL, CH y CL, y, DH y DL, H
significando High (alto) y L significando Low (bajo), indicando la parte alta o
la parte baja del registro correspondiente de 16 bits (ver esquema). Un
programa podía usar tanto los registros de 16 bits como los registros de 8
bits. Aparte del uso general de los registros para hacer cálculos aritméticos y
lógicos, existen instrucciones que usan estos registros con un uso particular
especializado, como se indica a continuación:
Registro AX: El registro
AX es el registro acumulador, es utilizado para operaciones que implican
entrada/salida, multiplicación y división (estas dos últimas en conjunto con el
registro DX)
Registro BX: El registro
BX es el registro base, y es el único registro de propósito general que puede
ser un índice para direccionamiento indexado
Registro CX: El registro
CX es conocido como el registro contador. Puede contener un valor para
controlar el número de veces que un ciclo se repite o un valor para corrimiento
de bits
Registro DX: El registro
DX es el registro de datos. En algunas operaciones se indica mediante este
registro el número de puerto de entrada/salida, y en las operaciones de
multiplicación y división de 16 bits se utiliza junto con el acumulador AX
Registros Índice
Los registros SI y DI
están disponibles para direccionamiento indexado y para operaciones de cadenas
de caracteres.
Registro SI: El registro
índice fuente de 16 bits es requerido por algunas operaciones con cadenas de
caracteres. El SI está asociado con el segmento DS.
Registro DI: El registro
índice destino también es requerido por algunas operaciones con cadenas de
caracteres. El DI está asociado con el segmento ES.
Registros Apuntadores
Los registros SP
(apuntador de pila) y BP (apuntador base) están asociados con el registro SS y
permiten al sistema acceder a datos en el segmento de la pila.
Registro SP: El apuntador
de pila de 16 bits está asociado con el segmento SS y proporciona un valor de
desplazamiento que se refiere a la palabra actual que está siendo procesada en
la pila. El sistema maneja de manera automática este registro, aunque el
programa puede hacer ciertas manipulaciones con él.
Registro BP: El apuntador
base de 16 bits facilita la referencia de parámetros dentro de la pila.
Registros de Banderas
Es un registro de 16 bits,
de los cuales nueve sirven para indicar el estado actual de la máquina y el
resultado del procesamiento. Muchas instrucciones aritméticas y de comparación
cambian el estado de las banderas y apoyándose en ellas se pueden tomar decisiones
para determinar la acción subsecuente.
La tabla contiene 16
posiciones (de 0 a 15), que son los 16 bits del registro de banderas, numeradas
de derecha a izquierda. La posición 0 la encontraremos a la derecha y la
posición 15 a la izquierda.
- - -
- OF DF IF TF SF ZF
- AF
- PF - CF
Los bits de las banderas
son las siguientes:
OF (overflow,
desbordamiento): Indica desbordamiento del bit de mayor orden después de una
operación aritmética de números con signo (1=existe overflow; 0=no existe
overflow). Para operaciones sin signo, no se toma en cuenta esta bandera.
DF (dirección): Controla
la selección de incremento o decremento de los registros SI y DI en las
operaciones con cadenas de caracteres (1=decremento automático; 0=incremento).
La bandera DF se controla con las instrucciones STD y CLD.
IF (interrupción):
Controla el disparo de las interrupciones (1=habilita las interrupciones;
0=deshabilita las interrupciones). La interrupción no enmascarable es la única
que no puede ser bloqueada por esta bandera. El estado de la bandera IF se
controla con las instrucciones STI y CLI.
TF (trampa): Permite la
operación del procesador en modo de depuración (paso a paso)
SF (signo): Contiene el
signo resultante de una operación aritmética (0=positivo; 1=negativo).
ZF (cero): Indica el
resultado de una operación aritmética o de comparación (0=resultado diferente
de cero; 1=resultado igual a cero).
AF (acarreo auxiliar):
Contiene el acarreo del bit 3. Esta bandera se prueba con las instrucciones DAA
y DAS para ajustar el valor de AL después de una suma o resta BCD.
PF (paridad): Indica si el
número de bits 1, del byte menos significativos de una operación, es par
(0=número de bits 1 es impar; 1=número de bits 1 es par).
CF (acarreo): Contiene el
acarreo del bit de mayor orden después de una operación aritmética; también
almacena el contenido del último bit en una operación de desplazamiento o de
rotación.
Registros de Segmento
Definen áreas de 64 Kb
dentro del espacio de direcciones de 1 Mb del 8086. Estas áreas pueden
solaparse total o parcialmente. No es posible acceder a una posición de memoria
no definida por algún segmento: si es preciso, habrá de moverse alguno.
Registro CS: El DOS
almacena la dirección inicial del segmento de código de un programa en el
registro CS. Esta dirección de segmento, más un valor de desplazamiento en el
registro apuntador de instrucción (IP), indica la dirección de una instrucción
que es buscada para su ejecución. Para propósitos de programación normal, no se
necesita referenciar el registro CS.
Registro DS: La dirección
inicial de un segmento de datos de programa es almacenada en el registro DS.
Esta dirección, más un valor de desplazamiento en una instrucción, genera una
referencia a la localidad de un byte específico en el segmento de datos.
Registro SS: El registro
SS permite la colocación en memoria de una pila, para almacenamiento temporal
de direcciones y datos. El DOS almacena la dirección de inicio del segmento de
pila de un programa en el registro SS. Esta dirección de segmento, más un valor
de desplazamiento en el registro del apuntador de la pila (SP), indica la
palabra actual en la pila que está siendo direccionada. Para propósitos de
programación normal, no se necesita referenciar el registro SS.
Registro ES: Algunas
operaciones con cadenas de caracteres utilizan el registro extra de segmento
para manejar el direccionamiento de memoria. El registro ES está asociado con el
registro DI (Índice). Un programa que requiere el uso del registro ES puede
inicializarlo con una dirección de segmento apropiada.
Registro Apuntador de
Instrucciones
El registro IP de 16 bits
contiene el desplazamiento de dirección de la siguiente instrucción que se
ejecuta. El IP está asociado con el registro CS en el sentido de que el IP
indica la instrucción actual dentro del segmento de código que se está
ejecutando actualmente en la memoria.
No hay comentarios:
Publicar un comentario