Está en la página 1de 109

Los microprocesadores 8086 y 8088

Historia del 8086/8088

En junio de 1978 Intel lanzó al mercado el primer microprocesador de 16 bits: el 8086.


En junio de 1979 apareció el 8088 (internamente igual que el 8086 pero con bus de
datos de 8 bits) y en 1980 los coprocesadores 8087 (matemático) y 8089 (de entrada y
salida). El primer fabricante que desarrolló software y hardware para estos chips fue la
propia Intel. Reconociendo la necesidad de dar soporte a estos circuitos integrados, la
empresa invirtió gran cantidad de dinero en un gran y moderno edificio en Santa Clara,
California, dedicado al diseño, fabricación y venta de sus sistemas de desarrollo que,
como se explicó anteriormente, son computadoras autosuficientes con el hardware y
software necesario para desarrollar software de microprocesadores.

Los sistemas de desarrollo son factores clave para asegurar las ventas de una empresa
fabricantes de chips. La inmensa mayoría de ventas son a otras empresas, las cuales
usan estos chips en aparatos electrónicos, diseñados, fabricados y comercializados por
ellas mismas. A estas empresas se las llama "fabricantes de equipo original", o en
inglés, OEM (Original Equipment Manufacturer). El disminuir el tiempo de desarrollo
de hardware y software para las OEM es esencial, ya que el mercado de estos productos
es muy competitivo. Necesitan soporte pues los meses que les puede llevar el desarrollo
de las herramientas apropiadas les puede significar pérdidas por millones de dólares.
Además quieren ser los primeros fabricantes en el mercado, con lo cual pueden
asegurarse las ventas en dos áreas importantes: a corto plazo, ya que al principio la
demanda es mucho mayor que la oferta, y a largo plazo, ya que el primer producto
marca a menudo los estándares.

De esta manera la empresa Intel había desarrollado una serie completa de software que
se ejecutaba en una microcomputadora basada en el 8085 llamada "Intellec
Microcomputer Development System". Los programas incluían ensambladores cruzados
(éstos son programas que se ejecutan en un microprocesador y generan código de
máquina que se ejecuta en otro), compiladores de PL/M, Fortran y Pascal y varios
programas de ayuda. Además había un programa traductor llamado CON V86 que
convertía código fuente 8080/8085 a código fuente 8086/8088. Si se observan de cerca
ambos conjuntos de instrucciones, queda claro que la transformación es sencilla si los
registros se traducen así: A -> AL, B -> CH, C -> CL, D -> DH, E -> DL, H -> BH y L
-> BL. Puede parecer complicado traducir LDAX B (por ejemplo) ya que el 8088 no
puede utilizar el registro CX para direccionamiento indirecto, sin embargo, se puede
hacer con la siguiente secuencia: MOV SI, CX; MOV AL, [SI]. Esto aprovecha el
hecho que no se utiliza el registro SI. Por supuesto el programa resultante es más largo
(en cantidad de bytes) y a veces más lento de correr que en su antecesor 8085. Este
programa de conversión sólo servía para no tener que volver a escribir los programas en
una primera etapa. Luego debería reescribirse el código fuente en assembler para poder
obtener las ventajas de velocidad ofrecidas por el 8088. Luego debía correr el programa
en la iSBC 86/12 Single Board Computer basado en el 8086. Debido al engorro que
resultaba tener dos plaquetas diferentes, la empresa Godbout Electronics (también de
California) desarrolló una placa donde estaban el 8085 y el 8088, donde se utilizaba un
ensamblador cruzado provisto por la compañía Microsoft. Bajo control de software,
podían conmutarse los microprocesadores. El sistema operativo utilizado era el CP/M
(de Digital Research).
El desarrollo más notable para la familia 8086/8088 fue la elección de la CPU 8088 por
parte de IBM (International Business Machines) cuando en 1981 entró en el campo de
las computadoras personales. Esta computadora se desarrolló bajo un proyecto con el
nombre "Acorn" (Proyecto "Bellota") pero se vendió bajo un nombre menos
imaginativo, pero más correcto: "Computadora Personal IBM", con un precio inicial
entre 1260 dólares y 3830 dólares según la configuración (con 48KB de memoria RAM
y una unidad de discos flexibles con capacidad de 160KB costaba 2235 dólares). Esta
computadora entró en competencia directa con las ofrecidas por Apple (basado en el
6502) y por Radio Shack (basado en el Z-80).

Arquitectura de los procesadores 8088 y 8086:


El 8086 es un microprocesador de 16 bits, tanto en lo que se refiere a su estructura
como en sus conexiones externas, mientras que el 8088 es un procesador de 8 bits que
internamente es casi idéntico al 8086. La única diferencia entre ambos es el tamaño del
bus de datos externo. Intel trata esta igualdad interna y desigualdad externa dividiendo
cada procesador 8086 y 8088 en dos sub-procesadores. O sea, cada uno consta de una
unidad de ejecución (EU: Execution Unit) y una unidad interfaz del bus (BIU: Bus
Interface Unit). La unidad de ejecución es la encargada de realizar todas las operaciones
mientras que la unidad de interfaz del bus es la encargada de acceder a datos e
instrucciones del mundo exterior. Las unidades de ejecución son idénticas en ambos
microprocesadores, pero las unidades de interfaz del bus son diferentes en varias
cuestiones, como se desprende del siguiente diagrama en bloques:
La ventaja de esta división fue el ahorro de esfuerzo necesario para producir el 8088.
Sólo una mitad del 8086 (el BIU) tuvo que rediseñarse para producir el 8088.

La explicación del diagrama en bloques es la siguiente:

Registros de uso general del 8086/8088:

Tienen 16 bits cada uno y son ocho:

1. AX = Registro acumulador, dividido en AH y AL (8 bits cada uno).


Usándolo se produce (en general) una instrucción que ocupa un byte menos que
si se utilizaran otros registros de uso general. Su parte más baja, AL, también
tiene esta propiedad. El último registro mencionado es el equivalente al
acumulador de los procesadores anteriores (8080 y 8085). Además hay
instrucciones como DAA; DAS; AAA; AAS; AAM; AAD; LAHF; SAHF;
CBW; IN y OUT que trabajan con AX o con uno de sus dos bytes (AH o AL).
También se utiliza este registro (junto con DX a veces) en multiplicaciones y
divisiones.
2. BX = Registro base, dividido en BH y BL.
Es el registro base de propósito similar (se usa para direccionamiento indirecto)
y es una versión más potente del par de registros HL de los procesadores
anteriores.
3. CX = Registro contador, dividido en CH y CL.
Se utiliza como contador en bucles (instrucción LOOP), en operaciones con
cadenas (usando el prefijo REP) y en desplazamientos y rotaciones (usando el
registro CL en los dos últimos casos).
4. DX = Registro de datos, dividido en DH y DL.
Se utiliza junto con el registro AX en multiplicaciones y divisiones, en la
instrucción CWD y en IN y OUT para direccionamiento indirecto de puertos (el
registro DX indica el número de puerto de entrada/salida).
5. SP = Puntero de pila (no se puede subdividir).
Aunque es un registro de uso general, debe utilizarse sólo como puntero de pila,
la cual sirve para almacenar las direcciones de retorno de subrutinas y los datos
temporarios (mediante las instrucciones PUSH y POP). Al introducir (push) un
valor en la pila a este registro se le resta dos, mientras que al extraer (pop) un
valor de la pila este a registro se le suma dos.
6. BP = Puntero base (no se puede subdividir).
Generalmente se utiliza para realizar direccionamiento indirecto dentro de la
pila.
7. SI = Puntero índice (no se puede subdividir).
Sirve como puntero fuente para las operaciones con cadenas. También sirve para
realizar direccionamiento indirecto.
8. DI = Puntero destino (no se puede subdividir).
Sirve como puntero destino para las operaciones con cadenas. También sirve
para realizar direccionamiento indirecto.

Cualquiera de estos registros puede utilizarse como fuente o destino en operaciones


aritméticas y lógicas, lo que no se puede hacer con ninguno de los seis registros que se
verán más adelante.

Además de lo anterior, cada registro tiene usos especiales:

Unidad aritmética y lógica

Es la encargada de realizar las operaciones aritméticas (suma, suma con "arrastre",


resta, resta con "préstamo" y comparaciones) y lógicas (AND, OR, XOR y TEST). Las
operaciones pueden ser de 16 bits o de 8 bits.

Indicadores (flags)

Hay nueve indicadores de un bit en este registro de 16 bits. Los cuatro bits más
significativos están indefinidos, mientras que hay tres bits con valores determinados: los
bits 5 y 3 siempre valen cero y el bit 1 siempre vale uno (esto también ocurría en los
procesadores anteriores).
Registro de indicadores (16 bits)
Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Flag -- -- -- -- OF DF IF TF SF ZF 0 AF 0 PF 1 CF

CF (Carry Flag, bit 0): Si vale 1, indica que hubo "arrastre" (en caso de suma) hacia, o
"préstamo" (en caso de resta) desde el bit de orden más significativo del resultado. Este
indicador es usado por instrucciones que suman o restan números que ocupan varios
bytes. Las instrucciones de rotación pueden aislar un bit de la memoria o de un registro
poniéndolo en el CF.

PF (Parity Flag, bit 2): Si vale uno, el resultado tiene paridad par, es decir, un número
par de bits a 1. Este indicador se puede utilizar para detectar errores en transmisiones.

AF (Auxiliary carry Flag, bit 4): Si vale 1, indica que hubo "arrastre" o "préstamo"
del nibble (cuatro bits) menos significativo al nibble más significativo. Este indicador se
usa con las instrucciones de ajuste decimal.

ZF (Zero Flag, bit 6): Si este indicador vale 1, el resultado de la operación es cero.

SF (Sign Flag, bit 7): Refleja el bit más significativo del resultado. Como los números
negativos se representan en la notación de complemento a dos, este bit representa el
signo: 0 si es positivo, 1 si es negativo.

TF (Trap Flag, bit 8): Si vale 1, el procesador está en modo paso a paso. En este
modo, la CPU automáticamente genera una interrupción interna después de cada
instrucción, permitiendo inspeccionar los resultados del programa a medida que se
ejecuta instrucción por instrucción.

IF (Interrupt Flag, bit 9): Si vale 1, la CPU reconoce pedidos de interrupción externas
enmascarables (por el pin INTR). Si vale 0, no se reconocen tales interrupciones. Las
interrupciones no enmascarables y las internas siempre se reconocen
independientemente del valor de IF.

DF (Direction Flag, bit 10): Si vale 1, las instrucciones con cadenas sufrirán "auto-
decremento", esto es, se procesarán las cadenas desde las direcciones más altas de
memoria hacia las más bajas. Si vale 0, habrá "auto-incremento", lo que quiere decir
que las cadenas se procesarán de "izquierda a derecha".

OF (Overflow flag, bit 11): Si vale 1, hubo un desborde en una operación aritmética
con signo, esto es, un dígito significativo se perdió debido a que tamaño del resultado es
mayor que el tamaño del destino.

Sistema de control de la unidad de ejecución

Es el encargado de decodificar las instrucciones que le envía la cola y enviarle las


órdenes a la unidad aritmética y lógica según una tabla que tiene almacenada en ROM
llamada CROM (Control Read Only Memory).

Cola de instrucciones
Almacena las instrucciones para ser ejecutadas. La cola se carga cuando el bus está
desocupado, de esta manera se logra una mayor eficiencia del mismo. La cola del 8086
tiene 6 bytes y se carga de a dos bytes por vez (debido al tamaño del bus de datos),
mientras que el del 8088 tiene cuatro bytes. Esta estructura tiene rendimiento óptimo
cuando no se realizan saltos, ya que en este caso habría que vaciar la cola (porque no se
van a ejecutar las instrucciones que van después del salto) y volverla a cargar con
instrucciones que se encuentran a partir de la dirección a donde se salta. Debido a esto
las instrucciones de salto son (después de multiplicaciones y divisiones) las más lentas
de este microprocesador.

Registros de la unidad de interfaz con el bus:

El programador puede acceder a cinco registros de 16 bits cada uno, siendo cuatro de
ellos registros de segmento y el restante el puntero de instrucción (IP).

Los registros de segmento se llaman:

CS: Registro de segmento de código.


DS: Registro de segmento de datos.
ES: Registro de segmento extra.
SS: Registro de segmento de pila.

La utilización de estos registros se explica más adelante, en la sección que trata de


direccionamiento a memoria.

Lógica de control del bus:

El cometido de este bloque es poder unir los bloques anteriormente mencionados con el
mundo exterior, es decir, la memoria y los periféricos.

El 8088 tiene un bus de datos externo reducido de 8 bits. La razón para ello era prever la
continuidad entre el 8086 y los antiguos procesadores de 8 bits, como el 8080 y el 8085.
Teniendo el mismo tamaño del bus (así como similares requerimientos de control y
tiempo), el 8088, que es internamente un procesador de 16 bits, puede reemplazar a los
microprocesadores ya nombrados en un sistema ya existente.

El 8088 tiene muchas señales en común con el 8085, particularmente las asociadas con
la forma en que los datos y las direcciones están multiplexadas, aunque el 8088 no
produce sus propias señales de reloj como lo hace el 8085 (necesita un chip de soporte
llamado 8284, que es diferente del 8224 que necesitaba el microprocesador 8080). El
8088 y el 8085 siguen el mismo esquema de compartir los terminales correspondientes a
los 8 bits más bajos del bus de direcciones con los 8 bits del bus de datos, de manera
que se ahorran 8 terminales para otras funciones del microprocesador. El 8086 comparte
los 16 bits del bus de datos con los 16 más bajos del bus de direcciones.

El 8085 y el 8088 pueden, de hecho, dirigir directamente los mismos chips


controladores de periféricos. Las investigaciones de hardware para sistemas basados en
el 8080 o el 8085 son, en su mayoría, aplicables al 8088.

En todo lo recién explicado se basó el éxito del 8088.


Terminales (pinout) del 8088

Este microprocesador está encapsulado en el formato DIP (Dual Inline Package) de 40


patas (veinte de cada lado). La distancia entre las patas es de 0,1 pulgadas (2,54
milímetros), mientras que la distancia entre patas enfrentadas es de 0,6 pulgadas (15,32
milímetros).

Nótese en el gráfico el semicírculo que identifica la posición de la pata 1. Esto sirve


para no insertar el chip al revés en el circuito impreso.

El 8086/8088 puede conectarse al circuito de dos formas distintas: el modo máximo y el


modo mínimo. El modo queda determinado al poner un determinado terminal (llamado
MN/MX) a tierra o a la tensión de alimentación. El 8086/8088 debe estar en modo
máximo si se desea trabajar en colaboración con el Procesador de Datos Numérico 8087
y/o el Procesador de Entrada/Salida 8089 (de aquí se desprende que en la IBM PC el
8088 está en modo máximo). En este modo el 8086/8088 depende de otros chips
adicionales como el Controlador de Bus 8288 para generar el conjunto completo de
señales del bus de control. El modo mínimo permite al 8086/8088 trabajar de una forma
más autónoma (para circuitos más sencillos) en una manera casi idéntica al
microprocesador 8085.

Los 40 pines del 8088 en modo mínimo tienen las siguientes funciones:

1. GND (Masa)
2. A14 (Bus de direcciones)
3. A13 (Bus de direcciones)
4. A12 (Bus de direcciones)
5. A11 (Bus de direcciones)
6. A10 (Bus de direcciones)
7. A9 (Bus de direcciones)
8. A8 (Bus de direcciones)
9. AD7 (Bus de direcciones y datos)
10. AD6 (Bus de direcciones y datos)
11. AD5 (Bus de direcciones y datos)
12. AD4 (Bus de direcciones y datos)
13. AD3 (Bus de direcciones y datos)
14. AD2 (Bus de direcciones y datos)
15. AD1 (Bus de direcciones y datos)
16. AD0 (Bus de direcciones y datos)
17. NMI (Entrada de interrupción no enmascarable)
18. INTR (Entrada de interrupción enmascarable)
19. CLK (Entrada de reloj generada por el 8284)
20. GND (Masa)
21. RESET (Para inicializar el 8088)
22. READY (Para sincronizar periféricos y memorias lentas)
23. /TEST
24. /INTA (El 8088 indica que reconoció la interrupción)
25. ALE (Cuando está uno indica que salen direcciones por AD, en caso contrario,
es el bus de datos)
26. /DEN (Data enable: cuando vale cero debe habilitar los transceptores 8286 y
8287 (se conecta al pin de "output enable"), esto sirve para que no se mezclen
los datos y las direcciones).
27. DT/R (Data transmit/receive: se conecta al pin de dirección de los chips recién
indicados).
28. IO/M (Si vale 1: operaciones con ports, si vale 0: operaciones con la memoria)
29. /WR (Cuando vale cero hay una escritura)
30. HLDA (Hold Acknowledge: el 8088 reconoce el HOLD)
31. HOLD (Indica que otro integrado quiere adueñarse del control de los buses,
generalmente se usa para DMA o acceso directo a memoria).
32. /RD (Cuando vale cero hay una lectura)
33. MN/MX (Cuando esta entrada está en estado alto, el 8088 está en modo
mínimo, en caso contrario está en modo máximo)
34. /SSO (Junto con IO/M y DT/R esta salida sirve para determinar estados del
8088)
35. A19/S6 (Bus de direcciones/bit de estado)
36. A18/S5 (Bus de direcciones/bit de estado)
37. A17/S4 (Bus de direcciones/bit de estado)
38. A16/S3 (Bus de direcciones/bit de estado)
39. A15 (Bus de direcciones)
40. Vcc (+5V)

En modo máximo (cuando se aplica +5V al pin 33) hay algunos pines que cambian de
significado:

24.- QS1: Estado de la cola de instrucciones (bit 1).


25.- QS0: Estado de la cola de instrucciones (bit 0).
26.- S0: Bit de estado 0.
27.- S1: Bit de estado 1.
28.- S2: Bit de estado 2.
29.- /LOCK: Cuando vale cero indica a otros controladores del bus (otros
microprocesadores o un dispositivo de DMA) que no deben ganar el control del bus. Se
activa poniéndose a cero cuando una instrucción tiene el prefijo LOCK.
30.- RQ/GT1: Es bidireccional y tiene la misma función que HOLD/HLDA en modo
mínimo.
31.- RQ/GT0: Como RQ/GT1 pero tiene mayor prioridad.
34.- Esta salida siempre está a uno.
Por ser este microprocesador mucho más complejo que el 8085, tiene más bits de estado
que el recién mencionado. A título informativo se detallan los bits de estado:

DT/R /SSO
S2 IO/M Significado
S1 S0
1 0 0 0 Acceso a código (instrucciones)
1 0 0 1 Lectura de memoria
1 0 1 0 Escritura a memoria
1 0 1 1 Bus pasivo (no hace nada)
0 1 0 0 Reconocimiento de interrupción
0 1 0 1 Lectura de puerto de entrada/salida
0 1 1 0 Escritura a puerto de E/S
0 1 1 1 Estado de parada (Halt)
QS1 QS0 Significado
0 0 No hay operación
0 1 Primer byte del código de operación
1 0 Se vacía la cola de instrucciones
1 1 Siguiente byte de la instrucción

Modos de direccionamiento del 8086/8088:

Estos procesadores tienen 27 modos de direccionamiento (una cantidad bastante más


grande que los microprocesadores anteriores) o reglas para localizar un operando de una
instrucción. Tres de ellos son comunes a microprocesadores anteriores:
direccionamiento inmediato (el operando es un número que se encuentra en la misma
instrucción), direccionamiento a registro (el operando es un registro del
microprocesador) y direccionamiento inherente (el operando está implícito en la
instrucción, por ejemplo, en la multiplicación uno de los operandos siempre es el
acumulador). El resto de los modos sirve para localizar un operando en memoria. Para
facilitar la explicación de estos modos, se pueden resumir de la siguiente manera:

Deben sumarse cuatro cantidades: 1) dirección de segmento, 2) dirección base, 3) una


cantidad índice y 4) un desplazamiento.

La dirección de segmento se almacena en el registro de segmento (DS, ES, SS o CS).


En la próxima sección se indica la forma en que se hace esto. Por ahora basta con saber
que el contenido del registro de segmento se multiplica por 16 antes de utilizarse para
obtener la dirección real. El registro de segmentación siempre se usa para referenciar a
memoria.

La base se almacena en el registro base (BX o BP). El índice se almacena en el registro


índice (SI o DI). Cualquiera de estas dos cantidades, la suma de las dos o ninguna,
pueden utilizarse para calcular la dirección real, pero no pueden sumarse dos bases o
dos índices. Los registros restantes (AX, CX, DX y SP) no pueden utilizarse para
direccionamiento indirecto. El programador puede utilizar tanto la base como el índice
para gestionar ciertas cosas, tales como matrices de dos dimensiones, o estructuras
internas a otras estructuras, esquemas que se utilizan en las prácticas comunes de
programación. La base y el índice son variables o dinámicas, ya que están almacenadas
en registros de la CPU. Es decir, pueden modificarse fácilmente mientras se ejecuta un
programa.

Además del segmento, base e índice, se usa un desplazamiento de 16 bits, 8 bits o 0 bits
(sin desplazamiento). Ésta es una cantidad estática que se fija al tiempo de ensamblado
(paso de código fuente a código de máquina) y no puede cambiarse durante la ejecución
del programa (a menos que el programa se escriba sobre sí mismo, lo que constituye
una práctica no aconsejada).

Todo esto genera los 24 modos de direccionamiento a memoria que se ven a


continuación:

- Registro indirecto: 1) [BX], 2) [DI]. 3) [SI].


- Basado: 4) desp8[BX], 5) desp8[BP], 6) desp16[BX], 7) desp16[BP].
- Indexado: 8) desp8[SI], 9) desp8[DI], 10) desp16[SI], 11) desp16[DI].
- Basado-indexado: 12) [BX+SI], 13) [BX+DI], 14) [BP+SI], 15) [BX+DI].
- Basado-indexado con desplazamiento: 16) desp8[BX+SI], 17) desp8[BX+DI], 18)
desp8[BP+SI], 19) desp8[BX+DI], 20) desp16[BX+SI], 21) desp16[BX+DI], 22)
desp16[BP+SI], 23) desp16[BX+DI].
- Directo: 24) [desp16].

Aquí desp8 indica desplazamiento de 8 bits y desp16 indica desplazamiento de 16 bits.


Otras combinaciones no están implementadas en la CPU y generarán error al querer
ensamblar, por ejemplo, ADD CL,[DX+SI].

El ensamblador genera el tipo de desplazamiento más apropiado (0, 8 ó 16 bits)


dependiendo del valor que tenga la constante: si vale cero se utiliza el primer caso, si
vale entre -128 y 127 se utiliza el segundo, y en otro caso se utiliza el tercero. Nótese
que [BP] sin desplazamiento no existe. Al ensamblar una instrucción como, por
ejemplo, MOV AL,[BP], se generará un desplazamiento de 8 bits con valor cero. Esta
instrucción ocupa tres bytes, mientras que MOV AL,[SI] ocupa dos, porque no necesita
el desplazamiento.

Estos modos de direccionamiento producen algunos inconvenientes en el 8086/8088. La


CPU gasta tiempo calculando una dirección compuesta de varias cantidades.
Principalmente esto se debe al hecho de que el cálculo de direcciones está programado
en microcódigo (dentro de la CROM del sistema de control de la unidad de ejecución).
En las siguientes versiones (a partir del 80186/80188) estos cálculos están cableados en
la máquina y, por lo tanto, cuesta mucho menos tiempo el realizarlos.

Veamos un ejemplo: MOV AL, ES:[BX+SI+6]. En este caso el operando de la izquierda


tiene direccionamiento a registro mientras que el de la derecha indica una posición de
memoria. Poniendo valores numéricos, supongamos que los valores actuales de los
registros sean: ES = 3200h, BX = 200h, SI = 38h. Como se apuntó más arriba la
dirección real de memoria será:
ES * 10h + BX + SI + 6 = 3200h * 10h + 200h + 38h + 6 = 3223Eh

Estructura de memoria de segmentación: Como se ha mencionado anteriormente, el


8086/8088 usa un esquema ingenioso llamado segmentación, para acceder
correctamente a un megabyte completo de memoria, con referencias de direcciones de
sólo 16 bits.

Veamos cómo funciona. Cualquier dirección tiene dos partes, cada una de las cuales es
una cantidad de 16 bits. Una parte es la dirección de segmento y la otra es el offset. A su
vez el offset se compone de varias partes: un desplazamiento (un número fijo), una base
(almacenada en el registro base) y un índice (almacenado en el registro índice). La
dirección de segmento se almacena en uno de los cuatro registros de segmento (CS, DS,
ES, SS). El procesador usa estas dos cantidades de 16 bits para calcular la dirección real
de 20 bits, según la siguiente fórmula:

Dirección real = 16 * (dirección del segmento) + offset

Tal como veíamos antes, dado que 16 en decimal es 10 en hexadecimal, multiplicar por
ese valor es lo mismo que correr el número hexadecimal a la izquierda una posición.

Hay dos registros de segmento que tienen usos especiales: el microprocesador utiliza el
registro CS (con el offset almacenado en el puntero de instrucción IP) cada vez que se
debe acceder a un byte de instrucción de programa, mientras que las instrucciones que
utilizan la pila (llamados a procedimientos, retornos, interrupciones y las instrucciones
PUSH y POP) siempre utilizan el registro de segmento SS (con el offset almacenado en
el registro puntero de pila SP). De ahí los nombres que toman: CS es el segmento de
código mientras que SS es el registro segmento de pila.

Para acceder a datos en la memoria se puede utilizar cualquiera de los cuatro registros
de segmento, pero uno de ellos provoca que la instrucción ocupe un byte menos de
memoria: es el llamado segmento por defecto, por lo que en lo posible hay que tratar de
usar dicho segmento para direccionar datos. Este segmento es el DS (registro de
segmento de datos) para todos los casos excepto cuando se utiliza el registro base BP.
En este caso el segmento por defecto es SS.

Si se utiliza otro registro, el ensamblador genera un byte de prefijo correspondiente al


segmento antes de la instrucción: CS -> 2Eh, DS -> 3Eh, ES -> 26h y SS -> 36h. El uso
de estos diferentes segmentos significa que hay áreas de trabajo separadas para el
programa, pila y los datos. Cada área tiene un tamaño máximo de 64 KBytes. Dado que
hay cuatro registros de segmento, uno de programa (CS), uno de pila (SS) y dos de
datos (segmento de datos DS y segmento extra ES) el área de trabajo puede llegar a 4 *
64 KB = 256 KB en un momento dado suponiendo que las áreas no se superponen.

Si el programa y los datos ocupan menos de 64 KB, lo que se hace es fijar los registros
de segmento al principio del programa y luego se utilizan diferentes offsets para acceder
a distintas posiciones de memoria. En caso contrario necesariamente deberán cambiarse
los registros de segmento en la parte del programa que lo requiera. Los registros de
segmento DS, ES y SS se cargan mediante las instrucciones MOV y POP, mientras que
CS se carga mediante transferencias de control (saltos, llamadas, retornos,
interrupciones) intersegmento.
Estructura de interrupciones del 8086/8088

Hay tres clases de interrupción: por hardware, por software e internas (a las dos últimas
también se las llama "excepciones").

Veremos primeramente el caso de interrupciones por hardware: Como se mencionó


anteriormente, el 8086/8088 tiene dos entradas de petición de interrupción: NMI e
INTR y una de reconocimiento (INTA). La gran mayoría de las fuentes de interrupción
se conectan al pin INTR, ya que esto permite enmascarar las interrupciones (el NMI
no). Para facilitar esta conexión, se utiliza el circuito integrado controlador de
interrupciones, que tiene el código 8259A. Este chip tiene, entre otras cosas, ocho patas
para sendas fuentes de interrupción (IRQ0 - IRQ7), ocho para el bus de datos (D0 - D7),
una salida de INTR y una entrada de INTA. Esto permite una conexión directa con el
8088/8086. Al ocurrir una petición de alguna de las ocho fuentes, el 8259A activa la
pata INTR. Al terminar de ejecutar la instrucción en curso, el microprocesador activa la
pata INTA, lo que provoca que el 8259A envíe por el bus de datos un número de ocho
bits (de 0 a 255) llamado tipo de interrupción (programable por el usuario durante la
inicialización del 8259A), que el 8086/8088 utiliza para saber cuál es la fuente de
interrupción. A continuación busca en la tabla de vectores de interrupción la dirección
del manejador de interrupción (interrupt handler). Esto se hace de la siguiente manera.
Se multiplica el tipo de interrupción por cuatro, y se toman los cuatro bytes que se
encuentran a partir de esa dirección. Los dos primeros indican el offset y los dos últimos
el segmento del manejador, como se muestra a continuación.

00 02 04 06 08 0A 0C 0E 10 12 3FC 3FE
Posición memoria
IP CS IP CS IP CS IP CS IP CS .... IP CS
Tipo de interrupción 00 01 02 03 04 FF

Como se puede observar, la tabla ocupa el primer kilobyte de memoria (256 tipos * 4
bytes/tipo = 1024 bytes).

Una vez que se pusieron en la pila los flags, CS e IP (en ese orden), la CPU hace IF <- 0
(deshabilita interrupciones) y TF <- 0 (deshabilita la ejecución de instrucciones paso a
paso) para que el manejador de interrupción no sea interrumpido, y carga IP y CS con
los valores hallados en la tabla, con lo que se transfiere el control al manejador de
interrupción, que es el procedimiento encargado de atender la fuente de interrupción.
Luego de haber hecho su trabajo, el manejador debe terminar indicándole al controlador
de interrupciones que ya fue atendido el pedido y finalmente deberá estar la instrucción
IRET, que restaura los valores de los registros IP, CS y el registro de indicadores. El
manejador debe poner en la pila todos los registros que use y restaurar sus valores antes
de salir (en orden inverso al de su introducción en la pila), en caso contrario el sistema
corre peligro de "colgarse", ya que, al ocurrir la interrupción en cualquier momento de
la ejecución del programa, se cambiarían los valores de los registros en el momento
menos esperado, con consecuencias imprevisibles.

Las interrupciones por software ocurren cuando se ejecuta la instrucción INT tipo. De
esta manera se pueden simular interrupciones durante la depuración de un programa. El
tipo de interrupción (para poder buscar el vector en la tabla) aparece en la misma
instrucción como una constante de 8 bits. Muchos sistemas operativos (programas que
actúan a modo de interfaz entre los programas de los usuarios (llamados también
"aplicaciones") y el hardware del sistema) utilizan esta instrucción para llamadas a
servicios, lo que permite no tener que conocer la dirección absoluta del servicio,
permitiendo cambios en el sistema operativo sin tener que cambiar los programas que lo
ejecutan. De esta manera, una de las primeras operaciones que debe realizar dicho
sistema operativo es inicializar la tabla de vectores de interrupción con los valores
apropiados.

Existen algunas interrupciones predefinidas, de uso exclusivo del microprocesador, por


lo que no es recomendable utilizar estos tipos de interrupción para interrupciones por
hardware o software.

- Tipo 0: Ocurre cuando se divide por cero o el cociente es mayor que el valor máximo
que permite el destino.

- Tipo 1: Ocurre después de ejecutar una instrucción si TF (Trap Flag) vale 1. Esto
permite la ejecución de un programa paso a paso, lo que es muy útil para la depuración
de programas.

- Tipo 2: Ocurre cuando se activa la pata NMI (interrupción no enmascarable).

- Tipo 3: Existe una instrucción INT que ocupa un sólo byte, que es la correspondiente
a este tipo. En los programas depuradores (debuggers) (tales como Debug, CodeView,
Turbo Debugger, etc.), se utiliza esta instrucción como punto de parada (para ejecutar
un programa hasta una determinada dirección, fijada por el usuario del depurador, se
inserta esta instrucción en la dirección correspondiente a la parada y se lanza la
ejecución. Cuando el CS:IP apunte a esta dirección se ejecutará la INT 3, lo que
devolverá el control del procesador al depurador). Debido a esto, si se le ordena al
depurador que ejecute el programa hasta una determinada dirección en ROM (memoria
de sólo lectura) (por ejemplo, para ver cómo funciona una subrutina almacenada en
dicha memoria), la ejecución seguirá sin parar allí (ya que la instrucción INT 3 no se
pudo escribir sobre el programa). En el 80386, con su elaborado hardware de ayuda
para la depuración, se puede poner un punto de parada en ROM.

- Tipo 4: Ocurre cuando se ejecuta la instrucción de interrupción condicional INTO y el


flag OF (Overflow Flag) vale 1.

Los tipos 5 a 31 (1F en hexadecimal) están reservados para interrupciones internas


(también llamados "excepciones") de futuros microprocesadores.

Prioridad entre diferentes fuentes de interrupción:

1) Error de división, INT n (no enmascarable), INTO.


2) NMI (no enmascarable).
3) INTR (enmascarable mediante IF).
4) Ejecución paso a paso (enmascarable mediante TF).

Cap�tulo III: Microprocesadores 8086/88, 286, 386, 486 y Pentium.


3.1. - CARACTER�STICAS GENERALES.

Los microprocesadores Intel 8086 y 8088 se desarrollan a partir de un procesador


anterior, el 8080, que, en sus diversas encarnaciones -incluyendo el Zilog Z-80- ha sido
la CPU de 8 bits de mayor �xito.

Poseen una arquitectura interna de 16 bits y pueden trabajar con operandos de 8 y 16


bits; una capacidad de direccionamiento de 20 bits (hasta 1 Mb) y comparten el mismo
juego de instrucciones.

La filosof�a de dise�o de la familia del 8086 se basa en la compatibilidad y la


creaci�n de sistemas inform�ticos integrados, por lo que disponen de diversos
coprocesadores como el 8089 de E/S y el 8087, coprocesador matem�tico de coma
flotante. De acuerdo a esta filosof�a y para permitir la compatibilidad con los
anteriores sistemas de 8 bits, el 8088 se dise�� con un bus de datos de 8 bits, lo cual
le hace m�s lento que su hermano el 8086, pues �ste es capaz de cargar una palabra
ubicada en una direcci�n par en un solo ciclo de memoria mientras el 8088 debe
realizar dos ciclos leyendo cada vez un byte.

Disponen de 92 tipos de instrucciones, que pueden ejecutar con hasta 7 modos de


direccionamiento. Tienen una capacidad de direccionamiento en puertos de entrada y
salida de hasta 64K (65536 puertos), por lo que las m�quinas construidas entorno a
estos microprocesadores no suelen emplear la entrada/salida por mapa de memoria,
como veremos.

Entre esas instrucciones, las m�s r�pidas se ejecutan en 2 ciclos te�ricos de reloj
y unos 9 reales (se trata del movimiento de datos entre registros internos) y las m�s
lentas en 206 (divisi�n entera con signo del acumulador por una palabra extra�da de
la memoria). Las frecuencias internas de reloj t�picas son 4.77 MHz en la versi�n
8086; 8 MHz en la versi�n 8086-2 y 10 MHz en la 8086-1. Recu�rdese que un MHz
son un mill�n de ciclos de reloj, por lo que un PC est�ndar a 4,77 MHz puede
ejecutar de 20.000 a unos 0,5 millones de instrucciones por segundo, seg�n la
complejidad de las mismas (un 486 a 50 MHz, incluso sin memoria cach� externa es
capaz de ejecutar entre 1,8 y 30 millones de estas instrucciones por segundo).

El microprocesador Intel 80286 se caracteriza por poseer dos modos de


funcionamiento completamente diferenciados: el modo real en el que se encuentra nada
m�s ser conectado a la corriente y el modo protegido en el que adquiere capacidad de
proceso multitarea y almacenamiento en memoria virtual. El proceso multitarea consiste
en realizar varios procesos de manera aparentemente simult�nea, con la ayuda del
sistema operativo para conmutar autom�ticamente de uno a otro optimizando el uso de
la CPU, ya que mientras un proceso est� esperando a que un perif�rico complete una
operaci�n, se puede atender otro proceso diferente. La memoria virtual permite al
ordenador usar m�s memoria de la que realmente tiene, almacenando parte de ella en
disco: de esta manera, los programas creen tener a su disposici�n m�s memoria de la
que realmente existe; cuando acceden a una parte de la memoria l�gica que no existe
f�sicamente, se produce una interrupci�n y el sistema operativo se encarga de
acceder al disco y traerla.

Cuando la CPU est� en modo protegido, los programas de usuario tienen un acceso
limitado al juego de instrucciones; s�lo el proceso supervisor -normalmente el sistema
operativo- est� capacitado para realizar ciertas tareas. Esto es as� para evitar que los
programas de usuario puedan campar a sus anchas y entrar en conflictos unos con otros,
en materia de recursos como memoria o perif�ricos. Adem�s, de esta manera, aunque
un error software provoque el cuelgue de un proceso, los dem�s pueden seguir
funcionando normalmente, y el sistema operativo podr�a abortar el proceso colgado.
Por desgracia, con el DOS el 286 no est� en modo protegido y el cuelgue de un solo
proceso -bien el programa principal o una rutina operada por interrupciones- significa la
ca�da inmediata de todo el sistema.

El 8086 no posee ning�n mecanismo para apoyar la multitarea ni la memoria virtual


desde el procesador, por lo que es dif�cil dise�ar un sistema multitarea para el mismo
y casi imposible conseguir que sea realmente operativo. Obviamente, el 286 en modo
protegido pierde absolutamente toda la compatibilidad con los procesadores anteriores.
Por ello, en este libro s�lo trataremos el modo real, �nico disponible bajo DOS,
aunque veremos alguna instrucci�n extra que tambi�n se puede emplear en modo
real.

Las caracter�sticas generales del 286 son: tiene un bus de datos de 16 bits, un bus
de direcciones de 24 bits (16 Mb); posee 25 instrucciones m�s que el 8086 y admite 8
modos de direccionamiento. En modo virtual permite direccionar hasta 1 Gigabyte. Las
frecuencias de trabajo t�picas son de 12 y 16 MHz, aunque existen versiones a 20 y 25
MHz. Aqu�, la instrucci�n m�s lenta es la misma que en el caso del 8086, solo que
emplea 29 ciclos de reloj en lugar de 206. Un 286 de categor�a media (16 MHz)
podr�a ejecutar m�s de medio mill�n de instrucciones de estas en un segundo, casi
15 veces m�s que un 8086 medio a 8 MHz. Sin embargo, transfiriendo datos entre
registros la diferencia de un procesador a otro se reduce notablemente, aunque el 286 es
m�s r�pido y no s�lo gracias a los MHz adicionales.

Versiones mejoradas de los Intel 8086 y 8088 se encuentran tambi�n en los


procesadores NEC-V30 y NEC-V20 respectivamente. Ambos son compatibles
Hardware y Software, con la ventaja de que el procesado de instrucciones est�
optimizado, llegando a superar casi en tres veces la velocidad de los originales en
algunas instrucciones aritm�ticas. Tambi�n poseen una cola de preb�squeda mayor
(cuando el microprocesador est� ejecutando una instrucci�n, si no hace uso de los
buses externos, carga en una cola FIFO de unos pocos bytes las posiciones posteriores a
la que est� procesando, de esta forma una vez que concluye la instrucci�n en curso ya
tiene internamente la que le sigue). Adem�s, los NEC V20 y V30 disponen de las
mismas instrucciones adicionales del 286 en modo real, al igual que el 80186 y el
80188.

Por su parte, el 386 dispone de una arquitectura de registros de 32 bits, con un bus de
direcciones tambi�n de 32 bits (direcciona hasta 4 Gigabytes = 4096 Mb) y m�s
modos posibles de funcionamiento: el modo real (compatible 8086), el modo protegido
(relativamente compatible con el del 286), un modo protegido propio que permite
-�por fin!- romper la barrera de los tradicionales segmentos y el modo «virtual 86», en
el que puede emular el funcionamiento simult�neo de varios 8086. Una vez m�s,
todos los modos son incompatibles entre s� y requieren de un sistema operativo
espec�fico: si se puede perdonar al fabricante la p�rdida de compatibilidad del modo
avanzados del 286 frente al 8086, debido a la l�gica evoluci�n tecnol�gica, no se
puede decir lo mismo del 386 respecto al 286: no hubiera sido necesario a�adir un
nuevo modo protegido si hubiera sido mejor construido el del 286 apenas un par de
a�os atr�s. Normalmente, los 386 suelen operar en modo real (debido al DOS) por lo
que no se aprovechan las posibilidades multitarea ni de gesti�n de memoria. Por otra
parte, aunque se pueden emplear los registros de 32 bits en modo real, ello no suele
hacerse -para mantener la compatibilidad con procesadores anteriores- con lo que de
entrada se est� tirando a la basura un 50% de la capacidad de proceso del chip, aunque
por fortuna estos procesadores suelen trabajar a frecuencias de 16/20 MHz (obsoletas) y
normalmente de 33 y hasta 40 MHz.

El 386sx es una variante del 386 a nivel de hardware, aunque es compatible en


software. B�sicamente, es un 386 con un bus de datos de s�lo 16 bits -m�s lento, al
tener que dar dos pasadas para un dato de 32 bits-. De hecho, podr�a haber sido
dise�ado perfectamente para mantener una compatibilidad hardware con el 286,
aunque el fabricante lo evit� probablemente por razones comerciales.

El 486 se diferencia del 386 en la integraci�n en un solo chip del coprocesador 387.
Tambi�n se ha mejorado la velocidad de operaci�n: la versi�n de 25 MHz dobla en
t�rminos reales a un 386 a 25 MHz equipado con el mismo tama�o de memoria
cach�. La versi�n 486sx no se diferencia en el tama�o del bus, tambi�n de 32 bits,
sino en la ausencia del 387 (que puede ser a�adido externamente). Tambi�n existen
versiones de 486 con buses de 16 bits, el primer fabricante de estos chips, denominados
486SLC, ha sido Cyrix. Una tendencia iniciada por el 486 fue la de duplicar la
velocidad del reloj interno (pongamos por caso de 33 a 66 MHz) aunque en las
comunicaciones con los buses exteriores se respeten los 33 MHz. Ello agiliza la
ejecuci�n de las instrucciones m�s largas: bajo DOS, el rendimiento general del
sistema se puede considerar pr�cticamente el doble. Son los chips DX2 (tambi�n hay
una variante a 50 MHz: 25 x 2). La culminaci�n de esta tecnolog�a viene de la mano
de los DX4 a 75/100 MHz (25/33 x 3).

El Pentium, �ltimo procesador de Intel en el momento de escribirse estas l�neas,


se diferencia respecto al 486 en el bus de datos (ahora de 64 bits, lo que agiliza los
accesos a memoria) y en un elevad�simo nivel de optimizaci�n y segmentaci�n que
le permite, empleando compiladores optimizados, simultanear en muchos casos la
ejecuci�n de dos instrucciones consecutivas. Posee dos cach�s internas, tiene
capacidad para predecir el destino de los saltos y la unidad de coma flotante
experimenta elevadas mejoras. Sin embargo, bajo DOS, un Pentium b�sico s�lo es
unas 2 veces m�s r�pido que un 486 a la misma frecuencia de reloj. Comenz� en
60/90 MHz hasta los 166/200/233 MHz de las �ltimas versiones (Pentium Pro y
MMX), que junto a diversos clones de otros fabricantes, mejoran a�n m�s el
rendimiento. Todos los equipos Pentium emplean las t�cnicas DX, ya que las placas
base t�picas corren a 60 MHz. Para hacerse una idea, por unas 200000 pts de 1997 un
equipo Pentium MMX a 233 MHz es cerca de 2000 veces m�s r�pido en aritm�tica
entera que el IBM PC original de inicios de la d�cada de los 80; en coma flotante la
diferencia aumenta incluso algunos �rdenes m�s de magnitud. Y a una fracci�n del
coste (un mill�n de pts de aquel entonces que equivale a unos 2,5 millones de hoy en
d�a). Aunque no hay que olvidar la revoluci�n del resto de los componentes: 100
veces m�s memoria (central y de v�deo), 200 veces m�s grande el disco duro... y
que un disco duro moderno transfiere datos 10 veces m�s deprisa que la memoria de
aquel IBM PC original. Por desgracia, el software no ha mejorado el rendimiento, ni
remotamente, en esa proporci�n: es la factura pasada por las t�cnicas de
programaci�n cada vez a un nivel m�s alto (aunque nadie discute sus ventajas).

Una caracter�stica de los microprocesadores a partir del 386 es la disponibilidad de


memorias cach� de alta velocidad de acceso -muy pocos nanosegundos- que
almacenan una peque�a porci�n de la memoria principal. Cuando la CPU accede a
una posici�n de memoria, cierta circuiter�a de control se encarga de ir depositando el
contenido de esa posici�n y el de las posiciones inmediatamente consecutivas en la
memoria cach�. Cuando sea necesario acceder a la instrucci�n siguiente del
programa, �sta ya se encuentra en la cach� y el acceso es muy r�pido. Lo ideal
ser�a que toda la memoria del equipo fuera cach�, pero esto no es todav�a posible
actualmente. Una cach� de tama�o razonable puede doblar la velocidad efectiva de
proceso de la CPU. El 8088 carec�a de memoria cach�, pero s� estaba equipado con
una unidad de lectura adelantada de instrucciones con una cola de preb�squeda de 4
bytes: de esta manera, se agilizaba ya un tanto la velocidad de proceso al poder ejecutar
una instrucci�n al mismo tiempo que iba leyendo la siguiente.

3.2. - REGISTROS DEL 8086 Y DEL 286.

Estos procesadores disponen de 14 registros de 16 bits (el 286 alguno m�s, pero no
se suele emplear bajo DOS). La misi�n de estos registros es almacenar las posiciones
de memoria que van a experimentar repetidas manipulaciones, ya que los accesos a
memoria son mucho m�s lentos que los accesos a los registros. Adem�s, hay ciertas
operaciones que s�lo se pueden realizar sobre los registros. No todos los registros
sirven para almacenar datos, algunos est�n especializados en apuntar a las direcciones
de memoria. La mec�nica b�sica de funcionamiento de un programa consiste en
cargar los registros con datos de la memoria o de un puerto de E/S, procesar los datos y
devolver el resultado a la memoria o a otro puerto de E/S. Obviamente, si un dato s�lo
va a experimentar un cambio, es preferible realizar la operaci�n directamente sobre la
memoria, si ello es posible. A continuaci�n se describen los registros del 8086.

AX SP CS IP
BX BP DS flags
CX SI SS
DX DI ES
Registros
Registros Registro puntero
Registros punteros de
de de instrucciones
de datos pila e
segmento y flags
�ndices

- Registros de datos:
AX, BX, CX, DX: pueden utilizarse bien como registros de 16 bits o como dos
registros separados de 8 bits (byte superior e inferior) cambiando la X por H o L seg�n
queramos referirnos a la parte alta o baja respectivamente. Por ejemplo, AX se
descompone en AH (parte alta) y AL (parte baja). Evidentemente, �cualquier cambio
sobre AH o AL altera AX!: valga como ejemplo que al incrementar AH se le est�n
a�adiendo 256 unidades a AX.

AX = Acumulador.

Es el registro principal, es utilizado en las instrucciones de multiplicaci�n y


divisi�n y en algunas instrucciones aritm�ticas especializadas, as� como en ciertas
operaciones de car�cter espec�fico como entrada, salida y traducci�n. Obs�rvese
que el 8086 es suficientemente potente para realizar las operaciones l�gicas, la suma y
la resta sobre cualquier registro de datos, no necesariamente el acumulador.

BX = Base.
Se usa como registro base para referenciar direcciones de memoria con
direccionamiento indirecto, manteniendo la direcci�n de la base o comienzo de tablas
o matrices. De esta manera, no es preciso indicar una posici�n de memoria fija, sino la
n�mero BX (as�, haciendo avanzar de unidad en unidad a BX, por ejemplo, se puede
ir accediendo a un gran bloque de memoria en un bucle).

CX = Contador.
Se utiliza com�nmente como contador en bucles y operaciones repetitivas de
manejo de cadenas. En las instrucciones de desplazamiento y rotaci�n se utiliza como
contador de 8 bits.

DX = Datos.
Usado en conjunci�n con AX en las operaciones de multiplicaci�n y divisi�n
que involucran o generan datos de 32 bits. En las de entrada y salida se emplea para
especificar la direcci�n del puerto E/S.

- 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.

CS = Registro de segmento de c�digo (code segment).


Contiene la direcci�n del segmento con las instrucciones del programa. Los
programas de m�s de 64 Kb requieren cambiar CS peri�dicamente.

DS = Registro de segmento de datos (data segment).


Segmento del �rea de datos del programa.

SS = Registro de segmento de pila (stack segment).


Segmento de pila.
ES = Registro de segmento extra (extra segment).
Segmento de ampliaci�n para zona de datos. Es extraordinariamente �til
actuando en conjunci�n con DS: con ambos se puede definir dos zonas de 64 Kb, tan
alejadas como se desee en el espacio de direcciones, entre las que se pueden
intercambiar datos.

- Registros punteros de pila:

SP = Puntero de pila (stack pointer).


Apunta a la cabeza de la pila. Utilizado en las instrucciones de manejo de la pila.

BP = Puntero base (base pointer).


Es un puntero de base, que apunta a una zona dentro de la pila dedicada al
almacenamiento de datos (variables locales y par�metros de las funciones en los
programas compilados).

- Registros �ndices:

SI = �ndice fuente (source index).


Utilizado como registro de �ndice en ciertos modos de direccionamiento
indirecto, tambi�n se emplea para guardar un valor de desplazamiento en operaciones
de cadenas.

DI = �ndice destino (destination index).


Se usa en determinados modos de direccionamiento indirecto y para almacenar un
desplazamiento en operaciones con cadenas.

- Puntero de instrucciones o contador de programa:

IP = Puntero de instrucci�n (instruction pointer).


Marca el desplazamiento de la instrucci�n en curso dentro del segmento de
c�digo. Es autom�ticamente modificado con la lectura de una instrucci�n.

- Registro de estado o de indicadores (flags).

Es un registro de 16 bits de los cuales 9 son utilizados para indicar diversas


situaciones durante la ejecuci�n de un programa. Los bits 0, 2, 4, 6, 7 y 11 son
indicadores de condici�n, que reflejan los resultados de operaciones del programa; los
bits del 8 al 10 son indicadores de control y el resto no se utilizan. Estos indicadores
pueden ser comprobados por las instrucciones de salto condicional, lo que permite
variar el flujo secuencial del programa seg�n el resultado de las operaciones.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
• CF (Carry Flag): Indicador de acarreo. Su valor m�s habitual es lo que nos
llevamos en una suma o resta.
• OF (Overflow Flag): Indicador de desbordamiento. Indica que el resultado de
una operaci�n no cabe en el tama�o del operando destino.
• ZF (Zero Flag): Indicador de resultado 0 o comparaci�n igual.
• SF (Sign Flag): Indicador de resultado o comparaci�n negativa.
• PF (Parity Flag): Indicador de paridad. Se activa tras algunas operaciones
aritm�tico-l�gicas para indicar que el n�mero de bits a uno resultante es par.
• AF (Auxiliary Flag): Para ajuste en operaciones BCD.
• DF (Direction Flag): Indicador de direcci�n. Manipulando bloques de
memoria, indica el sentido de avance (ascendente/descendente).
• IF (Interrupt Flag): Indicador de interrupciones: puesto a 1 est�n permitidas.
• TF (Trap Flag): Indicador de atrape (ejecuci�n paso a paso).

3.3. - REGISTROS DEL 386 Y PROCESADORES SUPERIORES.

Los 386 y superiores disponen de muchos m�s registros de los que vamos a ver
ahora. Sin embargo, bajo el sistema operativo DOS s�lo se suelen emplear los que
veremos, que constituyen b�sicamente una extensi�n a 32 bits de los registros
originales del 8086.

Se ampl�a el tama�o de los registros de datos (que pueden ser accedidos en


fragmentos de 8, 16 � 32 bits) y se a�aden dos nuevos registros de segmento
multiprop�sito (FS y GS). Algunos de los registros aqu� mostrados son realmente de
32 bits (como EIP en vez de IP), pero bajo sistema operativo DOS no pueden ser
empleados de manera directa, por lo que no les consideraremos.

3.4. - MODOS DE DIRECCIONAMIENTO.

Son los distintos modos de acceder a los datos en memoria por parte del procesador.
Antes de ver los modos de direccionamiento, echaremos un vistazo a la sintaxis general
de las instrucciones, ya que pondremos alguna en los ejemplos:

INSTRUCCI�N DESTINO, FUENTE


Donde destino indica d�nde se deja el resultado de la operaci�n en la que pueden
participar (seg�n casos) FUENTE e incluso el propio DESTINO. Hay instrucciones,
sin embargo, que s�lo tienen un operando, como la siguiente, e incluso ninguno:

INSTRUCCI�N DESTINO

Como ejemplos, aunque no hemos visto a�n las instrucciones utilizaremos un par
de ellas: la de copia o movimiento de datos (MOV) y la de suma (ADD).

3.4.1. - ORGANIZACI�N DE DIRECCIONES: SEGMENTACI�N.

Como ya sabemos, los microprocesadores 8086 y compatibles poseen registros de un


tama�o m�ximo de 16 bits que direccionar�an hasta 64K; en cambio, la direcci�n
se compone de 20 bits con capacidad para 1Mb, hay por tanto que recurrir a alg�n
artificio para direccionar toda la memoria. Dicho artificio consiste en la segmentaci�n:
se trata de dividir la memoria en grupos de 64K. Cada grupo se asocia con un registro
de segmento; el desplazamiento (offset) dentro de ese segmento lo proporciona otro
registro de 16 bits. La direcci�n absoluta se calcula multiplicando por 16 el valor del
registro de segmento y sumando el offset, obteni�ndose una direcci�n efectiva de 20
bits. Esto equivale a concebir el mecanismo de generaci�n de la direcci�n absoluta,
como si se tratase de que los registros de segmento tuvieran 4 bits a 0 (imaginarios) a la
derecha antes de sumarles el desplazamiento:

direcci�n = segmento * 16 + offset

En la pr�ctica, una direcci�n se indica con la notaci�n SEGMENTO:OFFSET;


adem�s, una misma direcci�n puede expresarse de m�s de una manera: por ejemplo,
3D00h:0300h es equivalente a 3D30:0000h. Es importante resaltar que no se puede
acceder a m�s de 64 Kb en un segmento de datos. Por ello, en los procesadores 386 y
superiores no se deben emplear registros de 32 bit para generar direcciones (bajo DOS),
aunque para los c�lculos pueden ser interesantes (no obstante, s� ser�a posible
configurar estos procesadores para poder direccionar m�s memoria bajo DOS con los
registros de 32 bits, aunque no resulta por lo general pr�ctico).

3.4.2. - MODOS DE DIRECCIONAMIENTO.

- Direccionamiento inmediato: El operando es una constante situada detr�s del


c�digo de la instrucci�n. Sin embargo, como registro destino no se puede indicar uno
de segmento (habr� que utilizar uno de datos como paso intermedio).

ADD AX,0fffh

El n�mero hexadecimal 0fffh es la constante num�rica que en el


direccionamiento inmediato se le sumar� al registro AX. Al trabajar con
ensambladores, se pueden definir s�mbolos constantes (ojo, no variables) y es m�s
intuitivo:

dato EQU 0fffh ; s�mbolo constante


MOV AX,dato
Si se referencia a la direcci�n de memoria de una variable de la siguiente forma,
tambi�n se trata de un caso de direccionamiento inmediato:

dato DW 0fffh ; ahora es una variable


MO AX,OFFSET dato ; AX = "direcci�n de memoria"
de dato

Porque hay que tener en cuenta que cuando traduzcamos a n�meros el s�mbolo
podr�a quedar:

17F3:0A11 DW FFF
MOV AX,0A11

- Direccionamiento de registro: Los operandos, necesariamente de igual tama�o,


est�n contenidos en los registros indicados en la instrucci�n:

MOV DX,AX
MOV AH,AL

- Direccionamiento directo o absoluto: El operando est� situado en la direcci�n


indicada en la instrucci�n, relativa al segmento que se trate:

MOV AX,[57D1h]
MOV AX,ES:[429Ch]

Esta sintaxis (quitando la 'h' de hexadecimal) ser�a la que admite el programa


DEBUG (realmente habr�a que poner, en el segundo caso, ES: en una l�nea y el
MOV en otra). Al trabajar con ensambladores, las variables en memoria se pueden
referenciar con etiquetas simb�licas:

MOV AX,dato
MOV AX,ES:dato

dato DW 1234h ; variable del programa

En el primer ejemplo se transfiere a AX el valor contenido en la direcci�n


apuntada por la etiqueta dato sobre el segmento de datos (DS) que se asume por
defecto; en el segundo ejemplo se indica de forma expl�cita el segmento trat�ndose
del segmento ES. La direcci�n efectiva se calcula de la forma ya vista con
anterioridad: Registro de segmento * 16 + desplazamiento_de_dato (este
desplazamiento depende de la posici�n al ensamblar el programa).

- Direccionamiento indirecto: El operando se encuentra en una direcci�n se�alada


por un registro de segmento*16 m�s un registro base (BX/BP) o �ndice (SI/DI).
(Nota: BP act�a por defecto con SS).

MOV AX,[BP] ; AX = [SS*16+BP]


MOV ES:[DI],AX ; [ES*16+DI] = AX

- Indirecto con �ndice o indexado: El operando se encuentra en una direcci�n


determinada por la suma de un registro de segmento*16, un registro de �ndice, SI o DI
y un desplazamiento de 8 � 16 bits. Ejemplos:
MOV AX,[DI+DESP] � MOV AX,desp[DI]
ADD [SI+DESP],BX � ADD desp[SI],BX

- Indirecto con base e �ndice o indexado a base: El operando se encuentra en una


direcci�n especificada por la suma de un registro de segmento*16, uno de base, uno de
�ndice y opcionalmente un desplazamiento de 8 � 16 bits:

MOV AX,ES:[BX+DI+DESP] � MOV AX,ES:desp[BX][DI]


MOV CS:[BX+SI+DESP],CX � MOV CS:desp[BX][SI],CX

Combinaciones de registros de segmento y desplazamiento.

Como se ve en los modos de direccionamiento, hay casos en los que se indica


expl�citamente el registro de segmento a usar para acceder a los datos. Existen unos
segmentos asociados por defecto a los registros de desplazamiento (IP, SP, BP, BX, DI,
SI); s�lo es necesario declarar el segmento cuando no coincide con el asignado por
defecto. En ese caso, el ensamblador genera un byte adicional (a modo de prefijo) para
indicar cu�l es el segmento referenciado. La siguiente tabla relaciona las posibles
combinaciones de los registros de segmento y los de desplazamiento:

CS SS DS ES
IP S� No No No
SP No S� No No
BP con prefijo por defecto con prefijo con prefijo
BX con prefijo con prefijo por defecto con prefijo
SI con prefijo con prefijo por defecto con prefijo
DI con prefijo con prefijo por defecto con prefijo(1)
(1) Tambi�n por defecto en el manejo de cadenas.

Los 386 y superiores admiten otros modos de direccionamiento m�s sofisticados,


que se ver�n en el pr�ximo cap�tulo, despu�s de conocer todas las instrucciones
del 8086. Por ahora, con todos estos modos se puede considerar que hay m�s que
suficiente. De hecho, algunos se utilizan en muy contadas ocasiones.

3.5. - LA PILA.

La pila es un bloque de memoria de estructura LIFO (Last Input First Output:


�ltimo en entrar, primero en salir) que se direcciona mediante desplazamientos desde
el registro SS (segmento de pila). Las posiciones individuales dentro de la pila se
calculan sumando al contenido del segmento de pila SS un desplazamiento contenido en
el registro puntero de pila SP. Todos los datos que se almacenan en la pila son de
longitud palabra, y cada vez que se introduce algo en ella por medio de las instrucciones
de manejo de pila (PUSH y POP), el puntero se decrementa en dos; es decir, la pila
avanza hacia direcciones decrecientes. El registro BP suele utilizarse normalmente para
apuntar a una cierta posici�n de la pila y acceder indexadamente a sus elementos
-generalmente en el caso de variables- sin necesidad de desapilarlos para consultarlos.
La pila es utilizada frecuentemente al principio de una subrutina para preservar los
registros que no se desean modificar; al final de la subrutina basta con recuperarlos en
orden inverso al que fueron depositados. En estas operaciones conviene tener cuidado,
ya que la pila en los 8086 es com�n al procesador y al usuario, por lo que se
almacenan en ella tambi�n las direcciones de retorno de las subrutinas. Esta �ltima
es, de hecho, la m�s importante de sus funciones. La estructura de pila permite que
unas subrutinas llamen a otras que a su vez pueden llamar a otras y as� sucesivamente:
en la pila se almacenan las direcciones de retorno, que ser�n las de la siguiente
instrucci�n que provoc� la llamada a la subrutina. As�, al retornar de la subrutina se
extrae de la pila la direcci�n a donde volver. Los compiladores de los lenguajes de alto
nivel la emplean tambi�n para pasar los par�metros de los procedimientos y para
generar en ella las variables autom�ticas -variables locales que existen durante la
ejecuci�n del subprograma y se destruyen inmediatamente despu�s-. Por ello, una
norma b�sica es que se debe desapilar siempre todo lo apilado para evitar una p�rdida
de control inmediata del ordenador.

Ejemplo de operaci�n sobre la pila (todos los datos son arbitrarios):

3.6. - UN PROGRAMA DE EJEMPLO.

Aunque las instrucciones del procesador no ser�n vistas hasta el pr�ximo


cap�tulo, con objeto de ayudar a la imaginaci�n del lector elaboraremos un primer
programa de ejemplo en lenguaje ensamblador. La utilidad de este programa es dejar
patente que lo �nico que entiende el 8086 son n�meros, aunque nosotros nos
referiremos a ellos con unos s�mbolos que faciliten entenderlos. Tambi�n es
interesante este ejemplo para afianzar el concepto de registro de segmento.

En este programa s�lo vamos a emplear las instrucciones MOV, ya conocida, y


alguna otra m�s como la instrucci�n INC (incrementar), DEC (disminuir una unidad)
y JNZ (saltar si el resultado no es cero). Suponemos que el programa est� ubicado a
partir de la direcci�n de memoria 14D3:7A10 (arbitrariamente elegida) y que lo que
pretendemos hacer con �l es limpiar la pantalla. Como el ordenador es un PC con
monitor en color, la pantalla de texto comienza en B800:0000 (no es m�s que una zona
de memoria). Por cada car�cter que hay en dicha pantalla, comenzando arriba a la
izquierda, a partir de la direcci�n B800:0000 tenemos dos bytes: el primero, con el
c�digo ASCII del car�cter y el segundo con el color. Lo que vamos a hacer es
rellenar los 2000 caracteres (80 columnas x 25 l�neas) con espacios en blanco
(c�digo ASCII 32, � 20h en hexadecimal), sin modificar el color que hubiera antes.
Esto es, se trata de poner el valor 32 en la direcci�n B800:0000, la B800:0002, la
B800:0004... y as� sucesivamente.
El programa quedar�a en memoria de esta manera: La primera columna indica la
direcci�n de memoria donde est� el programa que se ejecuta (CS=14D3h e
IP=7A10h al principio). La segunda columna constituye el c�digo m�quina que
interpreta el 8086. Algunas instrucciones ocupan un byte de memoria, otras dos � tres
(las hay de m�s). La tercera columna contiene el nombre de las instrucciones, algo
mucho m�s legible para los humanos que los n�meros:

14D3:7A10 B9 D0 07 MOV CX,7D0H ; CX = 7D0h (2000


decimal = 7D0 hexadecimal)
14D3:7A13 B8 00 B8 MOV AX,0B800h ; segmento de la
memoria de pantalla
14D3:7A16 8E D8 MOV DS,AX ; apuntar segmento de
datos a la misma
14D3:7A18 BB 00 00 MOV BX,0 ; apuntar al primer
car�cter ASCII de la pantalla
14D3:7A1B C6 07 20 MOV BYTE PTR [BX],32 ; se pone BYTE PTR para
indicar que 32 es de 8 bits
14D3:7A1E 43 INC BX ; BX=BX+1 -< apuntar al
byte de color
14D3:7A1F 43 INC BX ; BX=BX+1 -< apuntar al
siguiente car�cter ASCII
14D3:7A20 49 DEC CX ; CX=CX-1 -< queda un
car�cter menos
14D3:7A21 75 F8 JNZ -8 ; si CX no es 0, saltar
8 bytes atr�s (a 14D3:7A1B)

Como se puede ver, la segunda instrucci�n (bytes de c�digo m�quina 0B8h, 0 y 0B8h colocados
en posiciones consecutivas) est� colocada a partir del desplazamiento 7A13h, ya que la anterior que
ocupaba 3 bytes comenzaba en 7A10h. En el ejemplo cargamos el valor 0B800h en DS apoy�ndonos en
AX como intermediario. El motivo es que los registros de segmento no admiten el direccionamiento
inmediato. A medida que se van haciendo programas, el ensamblador da mensajes de error cuando se
encuentra con estos fallos y permite ir aprendiendo con facilidad las normas, que tampoco son
demasiadas. La instrucci�n MOV BYTE PTR [BX],32 equivale a decir: «poner en la direcci�n de
memoria apuntada por BX (DS:[BX] para ser m�s exactos) el byte de valor 32». El valor 0F8h del
c�digo m�quina de la �ltima instrucci�n es el complemento a dos (n�mero negativo) del valor 8.

Normalmente, casi nunca habr� que ensamblar a mano consultando unas tablas, como hemos hecho
en este ejemplo. Sin embargo, la mejor manera de aprender ensamblador es no olvidando la estrecha
relaci�n de cada l�nea de programa con la CPU y la memoria.

 Volver al �ndice+

El microprocesador 8086/8088
La arquitectura de estos dos procesadores es similar, la únicas diferencias entre ambos
es que el diseño del 8088 tiene un bus de 8 bits para los datos, mientras que el 8086
puede transferir 16 bits a la vez en el mismo bus. Y la cola de instrucciones del 8088 es
de 4 bytes y la del 8086 es de 6 bytes. Sus características que destacan son el bus de
direcciones de 20 bits, con lo que pueden direccionar hasta 1 Megabyte de memoria
RAM, y hacer el manejo de memoria en forma segmentada en bloques de 64K bytes.
Para esto cuenta con 4 registros de segmento de 16 bits cada uno (CS, SS, DS y ES) y
con registros de 16 bits como offset (IP, SP, DI y SI principalmente).
Estos microprocesadores tiene 2 procesadores conectados internamente, como se puede
apreciar en la figura 2.1, estos procesadores son:

EU
Unidad de ejecución (Execution Unit).
BIU
Unidad de interfaz con el Bus (Bus Interface Unit).

Figure 2.1: Diagrama de bloque del 8086/8088

La unidad de ejecución (EU) se encarga de realizar las operaciones aritméticas y


lógicas, además de proporcionar las direcciones lógicas al BIU --una dirección lógica
está formada de dos direcciones, la primera indica el segmento en el cual se está
trabajando y la otra indica el offset, o desplazamiento, de este segmento; esto es
segment:offset--.

La EU tiene una unidad aritmética lógica (ALU) de 16 bits, un registro de banderas y un


conjunto de registros de propósito general. El registro de banderas contiene 6 banderas
de estado (que la EU manipula para indicar el estado del resultado de una operación
lógica o aritmética) y 3 banderas de control que se pueden manipular por los programas
para alterar las operaciones del procesador (figura 2.2).

Figure 2.2: Registro de Banderas del 8086.


Todos los registros y buses de datos en la EU tienen 16 bits de longitud para obtener
mayor rapidez en la transferencia interna. La EU cuenta con 8 registros de 16 bits que se
pueden utilizar para realizar computaciones. Cuatro de estos registros componen el
grupo de datos, estos son los registros acumulador (AX), base (BX), contador (CX) y
dato (DX). Además estos cuatro registros se pueden trabajar como dos registros de 8
bits cada uno. Así, los registros de datos se pueden trabajar con su parte alta (AH, BH,
CH y DH) o con su parte baja (AL, BL, CL y DL). Los siguientes dos registros
generales, el apuntador de pila (SP)2.1 y la base de la pila (BP)2.2 constituyen el grupo de
apuntadores y se encargan de manipular la pila. Los dos últimos registros generales, el
índice fuente (SI)2.3 y el índice destino (DI)2.4 forman el grupo de registros de índice y se
utilizan para operaciones de cadenas. Las direcciones que maneja el EU son de 16 bits
de longitud. La BIU se encarga de relocalizar estas direcciones para que la EU pueda
accesar completamente el megabyte del espacio de direcciones.

La unidad de interfaz con el Bus (BIU) es la responsables de la comunicación externa


del procesador. Esta unidad de proceso se encarga de traducir las direcciones lógicas a
direcciones físicas de la memoria con ayuda de los registros de segmento DS, SS, ES,
CS e IP. Para convertir una dirección lógica en una dirección física el BIU corre el valor
del registro de segmento 4 posiciones a la izquierda (que es equivalente a multiplicar
por 16h) y suma el valor del offset para obtener un valor de 20 bits necesarios, como se
muestra en la figura 2.3.

Figure 2.3: Generación de direcciones físicas

Los segmentos en la memoria pueden estar translapados, contiguos o disjuntos. El 8086


trabaja con un modelo de memoria circular, esto es, cuando la operación de translado de
memoria lógica a memoria física sobrepasa el megabyte de memoria, entonces se
direcciona la parte inicial de la memoria física.

La dirección de la siguiente instrucción que se ejecutará es CS:IP (Code Segment:


Instruction Pointer). Para incrementar la eficiencia, en períodos donde la EU está
ocupada ejecutando instrucciones, el BIU se adelanta a una petición de intrucción del
EU y busca más instrucciones de la memoria. Las instrucciones se almacenan en una
cola de instrucciones de 4 bytes para el 8088 y 6 bytes para el 8086. Bajo muchas
circunstancias las colas contienen al menos 1 byte instrucción y el EU no tiene que
esperar a que se busquen nuevas instrucciones. Las instrucciones almacenadas en la cola
son adyacentes en la memoria, así, cuando se ejecuta una instrucción que transfiere el
control a otra localidad el BIU limpia la cola y busca las nuevas instrucciones desde la
nueva dirección.

El 8088/8086 tienen un sistema de interrupciones simple y versátil , estos procesadores


pueden manejar hasta 256 interrupciones diferentes. Las entradas de las interrupciones
se encuentran almacenadas el vector de interrupciones en la parte baja de la memoria. A
cada interrupción se le asocia una doble palabra. Cada palabra doble corresponde al
CS:IP de la subrutina que la interrupción invoca. Las primeras cinco interrupciones se
utilizan para los siguientes errores: división por cero, paso sencillo (trap), interrupción
no enmascarable, punto de ruptura y sobreflujo. El 8088/8086 no distingue entre las
interrupciones generadas por hardware y por las interrupciones generadas por la
instrucción INT.

Next: El manejo de excepciones Up: La familia INTEL 80x86 Previous: La familia


INTEL 80x86
Amilcar Meneses

LA CPU 8086/8088 DE INTEL.

La empresa Intel introdujo el microprocesador 8086 de 16 bits en el


año 1978. Era el primer procesador que podía disponer de los
avances tecnológicos conseguidos en lenguajes de programación de
alto nivel y en sistemas operativos más potentes, con lo cual se
obtuvo la base para el diseño de las computadoras. Desde entonces,
todos los sistemas compatibles IBM se basan, en última instancia, en
la CPU 8086. Todos los descendientes de la 8086 de Intel han de ser
capaces de emular este procesador.

El software que se desarrollo para el 8086 también tenia que ser


compatible con chips posteriores.

El chip 8086 disponía de una estructura real de 16 bits, que el


permitía trabajar con un formato de datos de 16 bits, tanto interna
como externamente. Pero el elevado precio de los componentes de
memoria requeridos para su uso, dificulto su comercialización.

La empresa IBM contrato la firma Intel para diseñar el sucesor del


chip 8086, se llama CPU 8088. Las primeras computadoras
personales se introdujeron en el mercado en 1981. Estas
computadoras, que contaban con una capacidad de 16kb de
memoria, una unidad de cinta en forma de cassette, y un monitor
monocromo de color verde sin prestaciones gráficas. Ya hace más de
15 años de este acontecimiento.

Externamente, el chip 8088 solo usaba un formato de 8 bits para su


bus de datos. Pero internamente, trabaja con 16 bits, como el
procesador 8086. La CPU 8086/8088 fue equipada con un bus de
direcciones de 20 bits, que el permitía seleccionar 2 elevado a la 20
ubicaciones de memoria en forma directa, equivalente a 1 MB
(1,048,576 bytes), lo que definía el límite físico de la memoria de
este procesador. En sus inicios, en sus inicios funcionaba a una
frecuencia de reloj impresionante de 4.77MHz. Las computadoras XT
eran versiones mejoradas de las PC de IBM, con la incorporación de
un disco duro. Más adelante los modelos de Turbo XT compatibles,
contaban con velocidades 8 MHz, 10 MHz e incluso 12MHz.

Comparado con la potencia disponible hoy en día, es difícil imaginar


cual era la utilidad de una computadora con un procesador
8086/8088. No obstante, el software que se disponía aquellos días no
precisaba mucha potencia. Incluso un programa de tratamiento de
textos reciente, como el programa Word 5.5 de Microsoft, podría
funcionar correctamente con una CPU 8088.

EL 80286.

Pronto Intel introdujo un procesador más sofisticado, la CPU 80286,


que elevo las prestaciones de la PC a un nuevo nivel. El procesador
80286 usaba un bus de datos de 16 bits, tanto interna como
externamente, con lo cual superaba a su predecesor, sobre todo con
respecto a la cada vez mas potente nuevas aplicaciones. Se amplio
también el bus de direcciones de este procesador para direccionar 16
MB de memoria.

Otra diferencia básica entre el procesador 80286 y su predecesor era


el juego de comandos condensada en la CPU. Aumento el numero de
instrucciones que podría ejecutarse por segundo, no solamente
durante una mayor frecuencia de reloj, sino también mediante una
estructura de comandos más eficiente. Como resultado se multiplico
por tres el valor de MIPS (millones de instrucciones por segundo).

De todas formas, la diferencia predominante entre las CPU


8086/8088 y 80286 radica en la adición de un nuevo modelo
operativo. En el modo real o normal, la 286 funciona de la misma
manera que su predecesor, con la misma limitación de un MB de
memoria: Pero su mayor velocidad de reloj y juego de comandos más
eficientes permitía superar a sus predecesores, incluso en el modo
real.
El nuevo modo operativo, llamado modo protegido, le permite al
procesador 80286 direccionar y gestionar mas memoria, hasta 16
MB. Así es posible procesar varias aplicaciones diferentes
simultáneamente. A esta técnica se le llama multitarea.

El 80286 fue el primer procesador Intel capaz de realizar multitareas


que disfrutó de una fuerte comercialización. En todo esto, solo unas
cuantas aplicaciones, tales como Lotus 1-2-3 y Windows de Microsoft
podían aprovecharse de esta capacidad. El sistema operativo
MS/PCDos de las PC por sí solo no puede funcionar en el modo
protegido puesto que solo puede poner 640 KB de memoria de
trabajo a disposición de las aplicaciones. Sin embargo, existen otros
sistemas operativos, como el UNIX y el OS/2, ofrecen mucho mas en
este sentido.

En las PC de la categoría AT (tecnología avanzada), el procesador 286


se encuentra a menudo en la misma forma y en el mismo lugar que
en la CPU 8086/8088. En cambio, hay que notar que el chip 286 no
se fabricó con un formato completo. Es decir, tanto puede ser una
lámina cuadrada que se sujeta mediante clips metálicos, puede ser
un chip de forma cuadrada montada en un zócalo de plástico. Su
ubicación sobre las distintas placas madre puede variar también.
Normalmente, la única manera de identificar este chip es mediante
las siglas grabadas sobre su superficie.

EL 80386.

La siguiente generación de procesadores para la PC trajo consigo


importantes cambios en el mundo de la PC. Con la CPU 80386 DX,
Intel ofreció un chip de proceso que era ampliamente superior al de
sus predecesores. El 386 DX era el primer procesador de 32 Bites que
pudo usarse en placas madre de las PC. Al doblar la anchura externa
e interna del bus de datos utilizado en el 286, tanto interna como
externamente, se le abrieron nuevos horizontes a las computadoras
personales.

Las aplicaciones gráficas, que anteriormente corrían lentamente,


ahora podrían funcionar con más rapidez. Asimismo, el uso de las
interfaces gráficas de usuario (GUI), que requieren mucha más
potencia del procesador, dado que redefinen toda la pantalla después
de cada acción, comenzó a ser realmente posible y práctico después
de haberse introducido en 80386.

Desde que las velocidades de los relojes se elevaron de 16 a 33 y 40


MHz y que se instaló un caché externo de memoria (ver más
adelante) para incrementar el rendimiento del procesador, casi todas
las computadoras modernas pueden clasificarse como “computadoras
gráficas”, una distinción que ya existía desde hacía algún tiempo
entre las computadoras Apple, Commodore, Amiga y Atari ST que
utilizan procesadores Motorola.

Desde que el bus de direcciones se expandió a 32 bits, el chip puede


direccionar directamente 4.294.967.296 (2 elevado a la 32)
localizaciones de memoria, o 4 gigabytes de RAM. Esto hace posible
direccionar incluso 64 terabytes de forma virtual, lo que permite otro
modo de operación, llamado el modo real virtual. Con este modo de
operación, es posible efectuar la multitarea bajo MS- /PC-DOS porque
cada aplicación involucrada en el proceso de multitarea recibe una
CPU virtual con 1 MB de memoria.

Estas computadoras virtuales por separado operan como varios


procesadores 8088 independientes, trabajando en paralelo en un solo
sistema. No obstante, para crear este mundo artificial en la PC, se
necesitaba otra ampliación del sistema operativo. Esta adición pronto
fue introducida por Microsoft con la versión 3.0 del entorno gráfico de
usuario MS-Windows.

Al igual que la CPU 286, la 386 permanece completamente


compatible con códigos objeto en relación a sus predecesores. Esto
significa que todos los sistemas operativos y aplicaciones diseñados
para procesadores 8086 u 80286 también funcionarán en la CPU 386,
sólo que mucho más deprisa.

El 386 también entiende los juegos de comandos utilizados por los


chips más antiguos y los tiempos de ejecución son mas rápidos. A
una velocidad de reloj idéntica, por ejemplo 16 MHz, el 386 puede
alcanzar dos veces los MIPS (millones de instrucciones por segundo)
que la CPU 80286.

Una característica especial de la generación 386 es que cuenta con


una versión “degradada” del procesador, llamada 386SX con
velocidades de reloj entre 16 y 25 MHz. “Degradada” quiere decir en
este contexto que el 386SX utiliza una estructura de 32 bits sólo de
forma interna. En este sentido no es inferior a su hermano el 386
“puro”.

No obstante, externamente el SX utiliza un bus de datos que tiene el


mismo tamaño que el bus encontrado en la CPU 286. También el bus
de direcciones del “SX” es similar al del 286, lo cual le limita en
aplicaciones multitarea.

El 386SX consiste básicamente en un procesador 386 en una placa


madre 286. Este es el motivo por el que el SX ejecuta muchas tareas
de forma mas lenta que la de su hermano mayor, el 386 “puro”. Debe
estar cambiando constantemente entre su estructura interna propia
de 32 bits y la operación externa de 16 bits, lo cual cuesta tiempo.
El 386DX es fácilmente identificable en el marco de la placa madre.
Tiene forma cuadrada, una inscripción que lo distingue, y una
impresión en tinta azul-roja. Esta CPU 386DX está normalmente
localizada transversalmente frente a las ranuras de expansión de la
placa madre.

Puesto que los procesadores de la clase 386SX son


considerablemente más pequeños, es difícil localizarlos. En vez de
estar montados en un zócalo como otros procesadores Intel, están
soldados directamente al circuito madre. Así pues, no pueden sacarse
ni intercambiarse. Si una CPU 386SX deja de funcionar, deberá
cambiarse toda la placa madre.

LA ACTUAL ESTRELLA DE LA FAMILIA INTEL.

EL PROCESADOR 1486

El último procesador de Intel es el i486. Esta CPU, que es mas que un


procesador, se llama chip integrado. Este chip agrupa cuatro grupos
de funciones distintas (la CPU real, un coprocesador matemático, un
controlador caché y dos memorias de caché con 4k cada una) en un
solo componente. El i486 trabaja interna y externamente con una
estructura completa de 32 bits y puede alcanzar frecuencias de reloj
que van desde 25 hasta 50 MHz.

La diferencia principal entre el i486 y sus predecesores,


particularmente el chip 386, es el elevado nivel de integración del
i486, Incluso un 386 con un coprocesador, no puede compararse a un
i486.

La estructura del i486 tiene un controlador caché que está construido


dentro del chip, junto con dos cachés de 4k. Al igual que el caché on-
chip actúa como un buffer entre el procesador y la memoria de
trabajo. La operación básica del caché integrado es idéntica a la del
“caché de segundo nivel” externo, véase la descripción en el apartado
2.1.6, que explica el principio de caché RAM en detalle.

Él caché interno localizado en el i486 está organizado como un caché


“a través de una escritura buffer”. Este método lee los datos, que no
pueden encontrarse en el caché, desde la memoria de trabajo y
traslada esta información a la CPU y al caché. Las operaciones de
escritura para localizaciones de memoria que actualmente están
almacenadas en el caché, se efectúan tanto a las localizaciones de la
memoria de trabajo como a las del caché.

Esto asegura que la información en el caché esté actualizada. Un


algoritmo de gestión interna efectúa un buffer en estas operaciones
de lectura y escritura, hasta que el bus externo está disponible y
puede realizarse un acceso de escritura a la memoria de trabajo de la
computadora. Esto libera al procesador e impide períodos de espera.
Los contenidos del caché que menos se utilizan durante un cierto
período de tiempo, se identifican mediante un algoritmo de control
especial y vuelven a escribirse la próxima vez que se “refresca” el
caché.

Debido al controlador interno caché, la CPU, con su elevada


frecuencia de operación, rara vez debe esperar a la lentitud de la
RAM de la máquina. El caché actúa como un tipo de buffer
inteligente, una característica que también puede aplicarse al
controlador caché. Ya que esta técnica es capaz de impedir cualquier
período de espera, el i486 puede ejecutar casi todas las operaciones
en un solo ciclo de reloj. Esta capacidad, por sí sola, hace que el i486
sea superior al 386.

El i486 tiene un conjunto de comandos completo, que incluye todos


los conjuntos de comandos utilizados por sus predecesores. Esto da
lugar a una estructura de procesador compleja. Al igual que sus
predecesores, el i486 es un CISC (Com-plex Instruction Set
Computer) y es compatible en forma descendente hasta el 8086. La
compatibilidad descendente significa que el i486 ejecutará
aplicaciones originalmente escritas para los procesadores anteriores.
Debido a sus amplios conjuntos de comandos, los procesadores CISC
se caracterizan por una gran flexibilidad con las aplicaciones lo cual,
no obstante, puede también implicar una reducción de su velocidad.

Otros procesadores, los llamados RISC (Reduced Instruction Set


Computer) alcanzan unos niveles de rendimiento superiores
utilizando un reducido conjunto de comandos, que normalmente está
unido a una aplicación específica (como, por ejemplo, CAD). No
obstante, esto significa que el conjunto de comandos del procesador
puede no ser capaz de ejecutar otras aplicaciones. Así pues, la
velocidad aumenta mientras que la flexibilidad disminuye.

El i486 es algo así como un compromiso entre un nivel máximo de


flexibilidad y una velocidad de procesamiento que es
significativamente elevada para una computadora personal. La
complejidad del procesador CISC y la velocidad del procesador RISC
están satisfactoriamente combinadas en el 486.

Sin embargo, Intel ha desarrollado un sucesor al i486. El nuevo


procesador de 64 bits, llamado 80586 o Pentium.

Ahora que ya se tiene una visión general de la historia de los


microprocesadores Intel, pasamos a la pregunta que le interesa a
todos los usuarios: ¿Qué procesador se requiere para una aplicación
específica?
La prensa técnica en el campo de la informática tiende a hacer que
las computadoras estén listas para salir a la venta. Así pues, puede
parecer como si cierto tipo de hardware y software fuera obsoleto
muchos meses antes de que esto sucediera realmente. Incluso dentro
del siempre cambiante campo de la informática, suelen aparecer
productos que rompen todos los moldes sólo dos veces al año.

Así pues, si lee estas publicaciones con frecuencia, no asuma


automáticamente que las predicciones sean totalmente exactas.

Cuando se compra el hardware, muchos usuarios de computadoras


no tienen en consideración la aplicación que van a utilizar con el
mismo. Normalmente, sólo están interesados en los sistemas mas
recientes o en el que está actualmente en venta. Sin embargo, la
forma mejor y más económica para determinar el hardware que se
necesita es considerar cómo va a ser utilizado y con qué aplicación.

Desde el punto de vista de la aplicación, la selección de una


configuración, determinada de hardware en un principio en una
consecuencia de la decisión de utilizar un determinado software. Por
ejemplo, supongamos que vaya a utilizar su computadora
principalmente para procesar texto, dado que quiere preparar en su
casa lo que finalmente llevara a la oficina o a la inversa.

Otros programas no le interesan. Por supuesto, que se sobre entiende


que se quiere trabajar con el mismo procesador de textos en casa y
en la oficina. Si este programa es una aplicación DOS como Microsoft
Word 5.5, una computadora 286 es suficiente para sus necesidades.
Sin embargo, si en la oficina esta instalado Microsoft Word para
Windows 2.0 y se tiene que trabajar con el mismo en casa entonces
su computadora debe ajustarse a unos requisitos distintos.

Aunque vaya a ejecutar las mismas tareas que con Microsoft Word
5.5 (es decir, escribir cartas) necesitara una computadora mas
potente.

Mientras vaya a tratar principalmente contextos y cálculos, una


computadora personal equipada con una CPU 286. Esto incluye la
utilización de la maquina para propósitos de negocios tales como
contabilidad, teneduría de libros, inventario y correspondencia.

Pero también es cierto que algunas aplicaciones exigencias más


elevadas al sistema. Esto es especialmente válido cuando la
aplicación utiliza un entorno gráfico de usuario, tal como Windows. En
estos casos un 386 seria mas adecuado y deacuerdo a las
características se podrá optar entre 386SX y un 386DX.
Normalmente, un 486 solo es necesario cuando quiera ejecutar
aplicaciones especiales, tales como programa CAD complejos.
INCREMENTOS DEL RENDIMIENTO MEDIANTE LA INSTALACION DE
UN NUEVO PROCESADOR.

El rendimiento de un chip procesador no puede aumentarse.


Apretando tornillos no lograremos nada que el no pueda dar por si
mismo. A menudo sucede lo contrario: debido a una configuración
errónea el sistema opera a un rendimiento menor al potencial.

Solo cabe configurar óptimamente la computadora para obtener


mejores resultados. Aunque esto no aumentara la capacidad
operativa de su procesador, asegura que un sistema funcione a pleno
rendimiento.

Es imposible mejorar su computadora personal a una generación


elevada de procesadores simplemente instalando una nueva CPU.
Recuerde que los procesadores están unidos a otros componentes de
la placa madre a través de varios sistemas bus. Estas conexiones
están dispuestas de forma distinta en cada tipo de procesador. Así la
única forma de mejorar su 286 a un 386 o un 386 a un 486 es
sustituir totalmente la placa madre.

EL AUMENTO DE LA FRECUENCIA DE RELOJ DEL SISTEMA:

UNA CUESTION POLEMICA.

Dentro de la misma generación de procesadores (por ejemplo, la


generación 386), es teóricamente posible aumentar gradualmente el
rendimiento del procesador, mediante un sistema que aumente la
frecuencia del reloj, esto aumentaría el numero de operaciones que el
procesador podría ejecutar cada segundo, aumentando de esta forma
la productividad del procesador. De este modo, se puede crear un
386 de 20 MHz a un 386 de25 MHz, simplemente cambiando el reloj
del sistema por un más potente.

Probablemente el procesador no podrá funcionar a la frecuencia


aumentada ya que no fue diseñado para operar a esa velocidad. No
obstante, incluso si usted también a instalado una CPU capaz de
manejar la velocidad aumentada del reloj, podría encontrarse con
problemas adicionales ya que las placas madre y sus componentes,
especialmente el juego de chips, tampoco estaban diseñados para
operar a esa velocidad o frecuencia aumentada.

Así pues, el éxito de este tipo de mejora no puede garantizarse ya


que muchas operaciones con periodo de tiempo critico dependen de
la velocidad de reloj con que opera la CPU.

Puesto que este tipo de mejora rara vez funciona, no la discutiremos


en detalle. Asimismo recuerde que no vale la pena aumentar el
funcionamiento de su sistema mediante una velocidad de reloj
superior a un 25%, pues se corre el riesgo de dañar el procesador. El
único modo de aumentar el funcionamiento de el significativamente,
es sustituir la placa madre de su computadora.

3.- EL COPROCESADOR.

El termino completo es ¨coprocesador matematico¨, con este nombre


se puede deducir que no se trata de un elemento central, si no de un
asistente. Un coprocesador matemático aumenta la velocidad de una
computadora, ocupándose de algunas de las tareas de la CPU. No
obstante el coprocesador no es un componente indispensable en una
maquina. Se puede instalar un coprocesador en la placa madre,
siempre y cuando esta disponga de la ranura correspondiente.

Puesto que lo que hace la CPU no es otra cosa de cálculos, el lector


podría estar preguntándose porque necesita ayuda para realizarlos.
Lo que ocurre es que la CPU solo puede llevar a cabo operaciones
aritméticas básicas con números enteros.

La CPU tiene problemas para procesar operaciones con valores


fraccionarios puesto que no son números enteros. Así la CPU requiere
bastante tiempo para resolverlas. Siempre deban realizar muchos
cálculos complejos (por ejemplo, al calcular funciones tangentes,
exponenciales y raíces) puede disminuir su velocidad
considerablemente, debido especialmente a la unidad de
procesamiento tiene que ejecutar también otras tareas
simultáneamente.

Especialmente en aquellas operaciones en las cuales se trabaja con


fracciones y cifras muy complicadas en cuestiones aritméticas de
coma flotante, el coprocesador muestra su idoneidad. En aquellos
campos de aplicación donde se requieren muchas posiciones
decimales y los errores de redondeo deben de mantenerse tan
insignificantes como sea posible, resulta imprescindible la utilización
de un coprocesador.

Un coprocesador puede ser extremadamente útil para realizar este


tipo de cálculos. Normalmente, las aplicaciones científicas y técnicas
requieren un coprocesador matemático. No obstante, para utilizar un
coprocesador los programas deben estar específicamente diseñados
para ello. De nuevo el paquete de software que vaya usted a utilizar
constituye el factor decisivo que determinara si su sistema debe estar
equipado con un coprocesador. Algunos paquetes de programas
modernos de CAD/CAM, como AutoCAD, requieren un coprocesador.
Un coprocesador es también útil para utilizar gráficos vectoriales. Sin
embargo, no aumenta el rendimiento de las aplicaciones que utilizan
gráficas de puntos.

Con cada generación de CPU utilizada en sistemas de computadoras


personales Intel, también introducía sus correspondiente
coprocesador. Así las familias de procesadores Intel, desde 8088 al
80386, tienen sus compañeros coprocesadores matemáticos, el 8087,
80287, 80387SX y 80387. Sin embargo, otros fabricantes, como
AMD, CYRIX, ITT, y ULSI, también fabrican coprocesadores.

Los coprocesadores de estos fabricantes pueden utilizarse sin ningún


problema. Son totalmente compatibles con los coprocesadores de
Intel, en ocasiones son mas rápidos y precisos y siempre más
económicos. Aunque la denominación del modelo utilizado por los
distintos fabricantes para cada generación de procesadores varía, es
fácil determinar para cada línea de CPU se ha diseñado un
coprocesador dado. Los coprocesadores están todavía mas
críticamente ajustados a la velocidad del reloj que los procesadores
normales. Por lo tanto, debe asegurarse que cualquier coprocesador
que seleccione para su sistema este diseñado para manejar la
frecuencia de reloj de su computadora. Para ello, debe considerar
varios factores.

Los coprocesadores para computadoras 286, al contrario que los


coprocesadores de las demás familias de los procesadores, operan a
solo 2/3 de la capacidad de la frecuencia de reloj del sistema. Esto
significa que, para una computadora 286 de 16 MHz, podría
realmente utilizar un coprocesador diseñado para operar a 12 MHz.
Por parte de Intel ya se ofertan coprocesadores cuyo margen de
frecuencia va de 6 a 20 MHz. Puesto que la frecuencia del procesador
es solo 2/3 de la frecuencia real del sistema, solo hay un pequeño
aumento en el rendimiento cuando se añade un coprocesador a una
CPU 286. Habría un mayor aumento en el rendimiento con un sistema
386 porque este sistema utiliza un coprocesador que funciona a la
velocidad real del sistema.

Tal como mencionamos, el coprocesador para el 486 ya esta


construido en el chip de procesador. Como resultado, ya no es
necesario que los dos procesadores se comuniquen mediante un
externo.

El 486SX, la versión base del 486, no esta equipada con un


coprocesador integrado, pero puede instalarse un coprocesador
externo 487SX. Puesto que estos dos procesadores, al igual que las
familias inferiores de procesadores, diseñados para varias
aplicaciones especificas. Por ejemplo, se ha diseñado un coprocesador
que se utiliza específicamente con el paquete de software de
AutoCAD.

Weitek también ha desarrollado un coprocesador mayor y


significativamente más rápido que puede conectarse a las mayorías
de placas 386 y 486. Normalmente, las placas madres 386 están
equipadas con un zócalo capaz de aceptar tanto el Intel 80387 como
el Weitek 1167. Muchas placas 486 también pueden aceptar un
Weitek 4167 además del coporcesador integrado. Puesto que el
procesador Weitek opera de forma más precisa que el Intel estándar,
se utiliza a menudo en aplicaciones científicas.

EMULACIONES DEL COPROCESADOR.

No hace tanto que los coprocesadores costaban una fortuna, si bien


su utilización era necesaria como hoy en algunas aplicaciones. Por
esta razón, la alternativa más socorrida era servirse de un emulador
de coprocesador, dichos programas de emulación han sido diseñados
para dotar a la CPU de la metodología de trabajo de un coprocesador
y hacerlas actuar como si dispusieran del correspondiente chip
numérico.

Algunos de esos programas registran un elevado rendimiento y


funcionan de forma excelente. Su Software de aplicación es,
asimismo, adecuado. También los programas de aplicación trabajan
bien con estas emulaciones. Aun así, no llegan a sustituir las
alternativas de hardware. En la actualidad los precios de los
coprocesadores son tan bajos que las alternativas

de adquisición son bajas.

AUMENTO DEL RENDIMIENTO DEL COPROCESADOR MEDIANTE LA


UTILIZACION DE ZOCALOS FAST.

En general los coprocesadores pueden aplicarse ya lo expuesto en


relación con la sustitución de procesadores en los tema 2.1.1.
Unicamente puede añadirse la posibilidad que ofrece el 286 de
mejorar el rendimiento del procesador numérico con independencia
del resto de componentes de la placa madre. Como ya hemos
mencionado, la NPU 287 opera a una frecuencia de reloj de 2/3. Esto
admite modificaciones si se agrega al zócalo del procesador un zócalo
fast que sea entonces el que incorpore al coprocesador. Este
Trubozócalo contiene su propio cuarzo y actúa, por tanto,
independientemente de la frecuencia de reloj del sistema.

Los zócalos rápidos se pueden obtener en todas las frecuencias del


286. El chip del coprocesador que debe instalarse encima de ellos
tiene que estar configurado, naturalmente, para la frecuencia en
cuestión. Esto se mantiene igual. Emplear este método para que el
procesador funcione bastante más rápidamente que la CPU no tiene
mucho sentido: es como disponer de una calculadora muy veloz que
no pueda ofrecer resueltos por tener que adecuarse al ritmo de
reacción de su dueño.

Historia de los Microprocesadores Intel


Desde la aparición de los primeros microprocesadores en los inicios de la
década de los setentas, todas las áreas científicas y tecnológicas han sido
experimentado su más acelerado desarrollo en la historia de la humanidad. El
bajo costo, confiabilidad y reducido espacio de los sistemas digitales basados en
microprocesadores les han posibilitado el incursionar en aplicaciones que hasta
antes de esa década se hallaban restringidas a sistemas de alto costo y
considerados de alta tecnología. Las industrias de la telecomunicación,
automotriz, aeronáutica, de transformación, médica y de consumo casero, asi
como la educación, banca, y empresas de servicios, son solo algunas de las áreas
en las cuales el impacto de la electrónica digital es más evidente, ya que lo
palpamos en nuestro actuar cotidiano.
CISC
Es una abreviación de "Complex Instrution set computer". Se refiere a los
microprocesadores tradicionales que operan con grupos grandes de
instrucciones de procesador (lenguaje de maquina). Los microprocesadores
INTEL 80xxx estan dentro de esta categoria (incluido el PENTIUM). Los
procesadores CISC tienen un Set de instrucciones complejas por naturaleza que
requieren varios a muchos ciclos para completarse.
RISC
Es una abreviación de "Reduced Instruction Set Code", a diferencia de los CISC,
los procesadores RISC tienen un grupo de o Set de instrucciones simples
requiriendo uno o pocos ciclos de ejecución. Estas instrucciones pueden ser
utilizadas más eficientemente que la de los procesadores CISC con el diseño de
software apropiado, resultando en operaciones más rapídas.
LOS MICROPROCESADORES 8086 Y 8088
Historia del 8086/8088
En junio de 1978 Intel lanzó al mercado el primer microprocesador de 16 bits: el
8086. En junio de 1979 apareció el 8088 (internamente igual que el 8086 pero
con bus de datos de 8 bits) y en 1980 los coprocesadores 8087 (matemático) y
8089 (de entrada y salida). El primer fabricante que desarrolló software y
hardware para estos chips fue la propia Intel. Reconociendo la necesidad de dar
soporte a estos circuitos integrados, la empresa invirtió gran cantidad de dinero
en un gran y moderno edificio en Santa Clara, California, dedicado al diseño,
fabricación y venta de sus sistemas de desarrollo que, como se explicó
anteriormente, son computadoras autosuficientes con el hardware y software
necesario para desarrollar software de microprocesadores.
Los sistemas de desarrollo son factores clave para asegurar las ventas de una
empresa fabricantes de chips. La inmensa mayoría de ventas son a otras
empresas, las cuales usan estos chips en aparatos electrónicos, diseñados,
fabricados y comercializados por ellas mismas. A estas empresas se las llama
"fabricantes de equipo original", o en inglés, OEM (Original Equipment
Manufacturer). El disminuir el tiempo de desarrollo de hardware y software
para las OEM es esencial, ya que el mercado de estos productos es muy
competitivo. Necesitan soporte pues los meses que les puede llevar el desarrollo
de las herramientas apropiadas les puede significar pérdidas por millones de
dólares. Además quieren ser los primeros fabricantes en el mercado, con lo cual
pueden asegurarse las ventas en dos áreas importantes: a corto plazo, ya que al
principio la demanda es mucho mayor que la oferta, y a largo plazo, ya que el
primer producto marca a menudo los estándares.
De esta manera la empresa Intel había desarrollado una serie completa de
software que se ejecutaba en una microcomputadora basada en el 8085 llamada
"Intellec Microcomputer Development System". Los programas incluían
ensambladores cruzados (éstos son programas que se ejecutan en un
microprocesador y generan código de máquina que se ejecuta en otro),
compiladores de PL/M, Fortran y Pascal y varios programas de ayuda. Además
había un programa traductor llamado CON V86 que convertía código fuente
8080/8085 a código fuente 8086/8088. Si se observan de cerca ambos
conjuntos de instrucciones, queda claro que la transformación es sencilla si los
registros se traducen así: A -> AL, B -> CH, C -> CL, D -> DH, E -> DL, H
-> BH y L -> BL. Puede parecer complicado traducir LDAX B (por ejemplo)
ya que el 8088 no puede utilizar el registro CX para direccionamiento
indirecto, sin embargo, se puede hacer con la siguiente secuencia: MOV SI,
CX; MOV AL,[SI]. Esto aprovecha el hecho que no se utiliza el registro SI. Por
supuesto el programa resultante es más largo (en cantidad de bytes) y a veces
más lento de correr que en su antecesor 8085. Este programa de conversión
sólo servía para no tener que volver a escribir los programas en una primera
etapa. Luego debería reescribirse el código fuente en assembler para poder
obtener las ventajas de velocidad ofrecidas por el 8088. Luego debía correr el
programa en la iSBC 86/12 Single Board Computer basado en el 8086.
Debido al engorro que resultaba tener dos plaquetas diferentes, la empresa
Godbout Electronics (también de California) desarrolló una placa donde
estaban el 8085 y el 8088, donde se utilizaba un ensamblador cruzado
provisto por la compañía Microsoft. Bajo control de software, podían
conmutarse los microprocesadores. El sistema operativo utilizado era el CP/M
(de Digital Research).
El desarrollo más notable para la familia 8086/8088 fue la elección de la CPU
8088 por parte de IBM (International Business Machines) cuando en
1981 entró en el campo de las computadoras personales. Esta computadora se
desarrolló bajo un proyecto con el nombre "Acorn" (Proyecto "Bellota") pero se
vendió bajo un nombre menos imaginativo, pero más correcto: "Computadora
Personal IBM", con un precio inicial entre 1260 dólares y 3830 dólares según la
configuración (con 48KB de memoria RAM y una unidad de discos flexibles con
capacidad de 160KB costaba 2235 dólares). Esta computadora entró en
competencia directa con las ofrecidas por Apple (basado en el 6502) y por Radio
Shack (basado en el Z-80).
ARQUITECTURA DE LOS PROCESADORES 8088 Y 8086
El 8086 es un microprocesador de 16 bits, tanto en lo que se refiere a su
estructura como en sus conexiones externas, mientras que el 8088 es un
procesador de 8 bits que internamente es casi idéntico al 8086. La única
diferencia entre ambos es el tamaño del bus de datos externo. Intel trata esta
igualdad interna y desigualdad externa dividiendo cada procesador 8086 y
8088 en dos sub-procesadores. O sea, cada uno consta de una unidad de
ejecución (EU: Execution Unit) y una unidad interfaz del bus (BIU: Bus
Interface Unit). La unidad de ejecución es la encargada de realizar todas las
operaciones mientras que la unidad de interfaz del bus es la encargada de
acceder a datos e instrucciones del mundo exterior. Las unidades de ejecución
son idénticas en ambos microprocesadores, pero las unidades de interfaz del
bus son diferentes en varias cuestiones, como se desprende del siguiente
diagrama en bloques:
La ventaja de esta división fue el ahorro de esfuerzo necesario para producir el
8088. Sólo una mitad del 8086 (el BIU) tuvo que rediseñarse para producir
el 8088.
La explicación del diagrama en bloques es la siguiente:
Registros de uso general del 8086/8088:
Tienen 16 bits cada uno y son ocho:
1) AX = Registro acumulador, dividido en AH y AL (8 bits cada uno).
2) BX = Registro base, dividido en BH y BL.
3) CX = Registro contador, dividido en CH y CL.
4) DX = Registro de datos, dividido en DH y DL.
5) SP = Puntero de pila (no se puede subdividir).
6) BP = Puntero base (no se puede subdividir).
7) SI = Puntero índice (no se puede subdividir).
8) DI = Puntero destino (no se puede subdividir).
Cualquiera de estos registros puede utilizarse como fuente o destino en
operaciones aritméticas y lógicas, lo que no se puede hacer con ninguno de los
seis registros que se verán más adelante.
Además de lo anterior, cada registro tiene usos especiales:
AX: Usándolo se produce (en general) una instrucción que ocupa un byte menos
que si se utilizaran otros registros de uso general. Su parte más baja, AL,
también tiene esta propiedad. El último registro mencionado es el equivalente al
acumulador de los procesadores anteriores (8080 y 8085). Además hay
instrucciones como DAA; DAS; AAA; AAS; AAM; AAD; LAHF; SAHF; CBW; IN
y OUT que trabajan con AX o con uno de sus dos bytes (AH o AL). También se
utiliza este registro (junto con DX a veces) en multiplicaciones y divisiones.
BX: Es el registro base de propósito similar (se usa para direccionamiento
indirecto) y es una versión más potente del par de registros HL de los
procesadores anteriores.
CX: Se utiliza como contador en bucles (instrucción LOOP), en operaciones con
cadenas (usando el prefijo REP) y en desplazamientos y rotaciones (usando el
registro CL en los dos últimos casos).
DX: Se utiliza junto con el registro AX en multiplicaciones y divisiones, en la
instrucción CWD y en IN y OUT para direccionamiento indirecto de puertos (el
registro DX indica el número de puerto de entrada/salida).
SP: Aunque es un registro de uso general, debe utilizarse sólo como puntero de
pila, la cual sirve para almacenar las direcciones de retorno de subrutinas y los
datos temporarios (mediante las instrucciones PUSH y POP). Al introducir
(push) un valor en la pila a este registro se le resta dos, mientras que al extraer
(pop) un valor de la pila este a registro se le suma dos.
BP: Generalmente se utiliza para realizar direccionamiento indirecto dentro de
la pila.
SI: Sirve como puntero fuente para las operaciones con cadenas. También sirve
para realizar direccionamiento indirecto.
DI: Sirve como puntero destino para las operaciones con cadenas. También
sirve para realizar direccionamiento indirecto.
UNIDAD ARITMÉTICA Y LÓGICA
Es la encargada de realizar las operaciones aritméticas (suma, suma con
"arrastre", resta, resta con "préstamo" y comparaciones) y lógicas (AND, OR,
XOR y TEST). Las operaciones pueden ser de 16 bits o de 8 bits.
Indicadores (flags): Hay nueve indicadores de un bit en este registro de 16 bits.
Los cuatro bits más significativos están indefinidos, mientras que hay tres bits
con valores determinados: los bits 5 y 3 siempre valen cero y el bit 1 siempre
vale uno (esto también ocurría en los procesadores anteriores).
Registro de indicadores (16 bits)Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Flag -- --
-- -- OF DF IF TF SF ZF 0 AF 0 PF 1 CF
CF (Carry Flag, bit 0): Si vale 1, indica que hubo "arrastre" (en caso de suma)
hacia, o "préstamo" (en caso de resta) desde el bit de orden más significativo del
resultado. Este indicador es usado por instrucciones que suman o restan
números que ocupan varios bytes. Las instrucciones de rotación pueden aislar
un bit de la memoria o de un registro poniéndolo en el CF.
PF (Parity Flag, bit 2): Si vale uno, el resultado tiene paridad par, es decir, un
número par de bits a 1. Este indicador se puede utilizar para detectar errores en
transmisiones.
AF (Auxiliary carry Flag, bit 4): Si vale 1, indica que hubo "arrastre" o
"préstamo" del nibble (cuatro bits) menos significativo al nibble más
significativo. Este indicador se usa con las instrucciones de ajuste decimal.
ZF (Zero Flag, bit 6): Si este indicador vale 1, el resultado de la operación es
cero.
SF (Sign Flag, bit 7): Refleja el bit más significativo del resultado. Como los
números negativos se representan en la notación de complemento a dos, este bit
representa el signo: 0 si es positivo, 1 si es negativo.
TF (Trap Flag, bit 8): Si vale 1, el procesador está en modo paso a paso. En este
modo, la CPU automáticamente genera una interrupción interna después de
cada instrucción, permitiendo inspeccionar los resultados del programa a
medida que se ejecuta instrucción por instrucción.
IF (Interrupt Flag, bit 9): Si vale 1, la CPU reconoce pedidos de interrupción
externas enmascarables (por el pin INTR). Si vale 0, no se reconocen tales
interrupciones. Las interrupciones no enmascarables y las internas siempre se
reconocen independientemente del valor de IF.
DF (Direction Flag, bit 10): Si vale 1, las instrucciones con cadenas sufrirán
"auto-decremento", esto es, se procesarán las cadenas desde las direcciones más
altas de memoria hacia las más bajas. Si vale 0, habrá "auto-incremento", lo que
quiere decir que las cadenas se procesarán de "izquierda a derecha".
OF (Overflow flag, bit 11): Si vale 1, hubo un desborde en una operación
aritmética con signo, esto es, un dígito significativo se perdió debido a que
tamaño del resultado es mayor que el tamaño del destino.
SISTEMA DE CONTROL DE LA UNIDAD DE EJECUCIÓN
Es el encargado de decodificar las instrucciones que le envía la cola y enviarle
las órdenes a la unidad aritmética y lógica según una tabla que tiene almacenada
en ROM llamada CROM (Control Read Only Memory).
COLA DE INSTRUCCIONES
Almacena las instrucciones para ser ejecutadas. La cola se carga cuando el bus
está desocupado, de esta manera se logra una mayor eficiencia del mismo. La
cola del 8086 tiene 6 bytes y se carga de a dos bytes por vez (debido al tamaño
del bus de datos), mientras que el del 8088 tiene cuatro bytes. Esta estructura
tiene rendimiento óptimo cuando no se realizan saltos, ya que en este caso
habría que vaciar la cola (porque no se van a ejecutar las instrucciones que van
después del salto) y volverla a cargar con instrucciones que se encuentran a
partir de la dirección a donde se salta. Debido a esto las instrucciones de salto
son (después de multiplicaciones y divisiones) las más lentas de este
microprocesador.
Registros de la unidad de interfaz con el bus:
El programador puede acceder a cinco registros de 16 bits cada uno, siendo
cuatro de ellos registros de segmento y el restante el puntero de instrucción (IP).
Los registros de segmento se llaman:
CS: Registro de segmento de código.
DS: Registro de segmento de datos.
ES: Registro de segmento extra.
SS: Registro de segmento de pila.
La utilización de estos registros se explica más adelante, en la sección que trata
de direccionamiento a memoria.
Lógica de control del bus:
El cometido de este bloque es poder unir los bloques anteriormente
mencionados con el mundo exterior, es decir, la memoria y los periféricos.
El 8088 tiene un bus de datos externo reducido de 8 bits. La razón para ello era
prever la continuidad entre el 8086 y los antiguos procesadores de 8 bits, como
el 8080 y el 8085. Teniendo el mismo tamaño del bus (así como similares
requerimientos de control y tiempo), el 8088, que es internamente un
procesador de 16 bits, puede reemplazar a los microprocesadores ya nombrados
en un sistema ya existente.
El 8088 tiene muchas señales en común con el 8085, particularmente las
asociadas con la forma en que los datos y las direcciones están multiplexadas,
aunque el 8088 no produce sus propias señales de reloj como lo hace el 8085
(necesita un chip de soporte llamado 8284, que es diferente del 8224 que
necesitaba el microprocesador 8080). El 8088 y el 8085 siguen el mismo
esquema de compartir los terminales correspondientes a los 8 bits más bajos del
bus de direcciones con los 8 bits del bus de datos, de manera que se ahorran 8
terminales para otras funciones del microprocesador. El 8086 comparte los 16
bits del bus de datos con los 16 más bajos del bus de direcciones.
El 8085 y el 8088 pueden, de hecho, dirigir directamente los mismos chips
controladores de periféricos. Las investigaciones de hardware para sistemas
basados en el 8080 o el 8085 son, en su mayoría, aplicables al 8088.
En todo lo recién explicado se basó el éxito del 8088.
El 8086/8088 puede conectarse al circuito de dos formas distintas: el modo
máximo y el modo mínimo. El modo queda determinado al poner un
determinado terminal (llamado MN/MX) a tierra o a la tensión de alimentación.
El 8086/8088 debe estar en modo máximo si se desea trabajar en colaboración
con el Procesador de Datos Numérico 8087 y/o el Procesador de Entrada/Salida
8089 (de aquí se desprende que en la IBM PC el 8088 está en modo máximo).
En este modo el 8086/8088 depende de otros chips adicionales como el
Controlador de Bus 8288 para generar el conjunto completo de señales del bus
de control. El modo mínimo permite al 8086/8088 trabajar de una forma más
autónoma (para circuitos más sencillos) en una manera casi idéntica al
microprocesador 8085.
Los 40 pines del 8088 en modo mínimo tienen las siguientes funciones:
1.- GND (Masa)
2.- A14 (Bus de direcciones)
3.- A13 (Bus de direcciones)
4.- A12 (Bus de direcciones)
5.- A11 (Bus de direcciones)
6.- A10 (Bus de direcciones)
7.- A9 (Bus de direcciones)
8.- A8 (Bus de direcciones)
9.- AD7 (Bus de direcciones y datos)
10.- AD6 (Bus de direcciones y datos)
11.- AD5 (Bus de direcciones y datos)
12.- AD4 (Bus de direcciones y datos)
13.- AD3 (Bus de direcciones y datos)
14.- AD2 (Bus de direcciones y datos)
15.- AD1 (Bus de direcciones y datos)
16.- AD0 (Bus de direcciones y datos)
17.- NMI (Entrada de interrupción no enmascarable)
18.- INTR (Entrada de interrupción enmascarable)
19.- CLK (Entrada de reloj generada por el 8284)
20.- GND (Masa)
21.- RESET (Para inicializar el 8088)
22.- READY (Para sincronizar periféricos y memorias lentas)
23.- /TEST
24.- /INTA (El 8088 indica que reconoció la interrupción)
25.- ALE (Cuando está uno indica que salen direcciones por AD, en caso
contrario, es el bus de datos)
26.- /DEN (Data enable: cuando vale cero debe habilitar los transceptores 8286
y 8287 (se conecta al pin de "output enable"), esto sirve para que no se mezclen
los datos y las direcciones).
27.- DT/R (Data transmit/receive: se conecta al pin de dirección de los chips
recién indicados).
28.- IO/M (Si vale 1: operaciones con ports, si vale 0: operaciones con la
memoria)
29.- /WR (Cuando vale cero hay una escritura)
30.- HLDA (Hold Acknowledge: el 8088 reconoce el HOLD)
31.- HOLD (Indica que otro integrado quiere adueñarse del control de los buses,
generalmente se usa para DMA o acceso directo a memoria).
32.- /RD (Cuando vale cero hay una lectura)
33.- MN/MX (Cuando esta entrada está en estado alto, el 8088 está en modo
mínimo, en caso contrario está en modo máximo)
34.- /SSO (Junto con IO/M y DT/R esta salida sirve para determinar estados del
8088)
35.- A19/S6 (Bus de direcciones/bit de estado)
36.- A18/S5 (Bus de direcciones/bit de estado)
37.- A17/S4 (Bus de direcciones/bit de estado)
38.- A16/S3 (Bus de direcciones/bit de estado)
39.- A15 (Bus de direcciones)
40.- Vcc (+5V)
En modo máximo (cuando se aplica +5V al pin 33) hay algunos pines que
cambian de significado:
24.- QS1: Estado de la cola de instrucciones (bit 1).
25.- QS0: Estado de la cola de instrucciones (bit 0).
26.- S0: Bit de estado 0.
27.- S1: Bit de estado 1.
28.- S2: Bit de estado 2.
29.- /LOCK: Cuando vale cero indica a otros controladores del bus (otros
microprocesadores o un dispositivo de DMA) que no deben ganar el control del
bus. Se activa poniéndose a cero cuando una instrucción tiene el prefijo LOCK.
30.- RQ/GT1: Es bidireccional y tiene la misma función que HOLD/HLDA en
modo mínimo.
31.- RQ/GT0: Como RQ/GT1 pero tiene mayor prioridad.
34.- Esta salida siempre está a uno.
Por ser este microprocesador mucho más complejo que el 8085, tiene más bits
de estado que el recién mencionado. A título informativo se detallan los bits de
estado:

S2 IO/M S1 DT/R S0 /SSO Significado

1 0 0 0 Acceso a código (instrucciones)

1 0 0 1 Lectura de memoria

1 0 1 0 Escritura a memoria

1 0 1 1 Bus pasivo (no hace nada)

0 1 0 0 Reconocimiento de interrupción

0 1 0 1 Lectura de puerto de entrada/salida

0 1 1 0 Escritura a puerto de E/S

0 1 1 1 Estado de parada (Halt)

QS1 QS0 Significado

0 0 No hay operación

0 1 Primer byte del código de operación

1 0 Se vacía la cola de instrucciones

1 1 Siguiente byte de la instrucción


Modos de direccionamiento del 8086/8088:
Estos procesadores tienen 27 modos de direccionamiento (una cantidad
bastante más grande que los microprocesadores anteriores) o reglas para
localizar un operando de una instrucción. Tres de ellos son comunes a
microprocesadores anteriores: direccionamiento inmediato (el operando es un
número que se encuentra en la misma instrucción), direccionamiento a registro
(el operando es un registro del microprocesador) y direccionamiento inherente
(el operando está implícito en la instrucción, por ejemplo, en la multiplicación
uno de los operandos siempre es el acumulador). El resto de los modos sirve
para localizar un operando en memoria. Para facilitar la explicación de estos
modos, se pueden resumir de la siguiente manera:
Deben sumarse cuatro cantidades: 1) dirección de segmento, 2) dirección base,
3) una cantidad índice y 4) un desplazamiento.
La dirección de segmento se almacena en el registro de segmento (DS, ES, SS o
CS). En la próxima sección se indica la forma en que se hace esto. Por ahora
basta con saber que el contenido del registro de segmento se multiplica por 16
antes de utilizarse para obtener la dirección real. El registro de segmentación
siempre se usa para referenciar a memoria.
La base se almacena en el registro base (BX o BP). El índice se almacena en el
registro índice (SI o DI). Cualquiera de estas dos cantidades, la suma de las dos
o ninguna, pueden utilizarse para calcular la dirección real, pero no pueden
sumarse dos bases o dos índices. Los registros restantes (AX, CX, DX y SP) no
pueden utilizarse para direccionamiento indirecto. El programador puede
utilizar tanto la base como el índice para gestionar ciertas cosas, tales como
matrices de dos dimensiones, o estructuras internas a otras estructuras,
esquemas que se utilizan en las prácticas comunes de programación. La base y
el índice son variables o dinámicas, ya que están almacenadas en registros de la
CPU. Es decir, pueden modificarse fácilmente mientras se ejecuta un programa.
Además del segmento, base e índice, se usa un desplazamiento de 16 bits, 8 bits
o 0 bits (sin desplazamiento). Ésta es una cantidad estática que se fija al tiempo
de ensamblado (paso de código fuente a código de máquina) y no puede
cambiarse durante la ejecución del programa (a menos que el programa se
escriba sobre sí mismo, lo que constituye una práctica no aconsejada).
Todo esto genera los 24 modos de direccionamiento a memoria que se ven a
continuación:
• Registro indirecto: 1) [BX], 2) [DI]. 3) [SI].
• Basado: 4) desp8[BX], 5) desp8[BP], 6) desp16[BX], 7) desp16[BP].
• Indexado: 8) desp8[SI], 9) desp8[DI], 10) desp16[SI], 11) desp16[DI].
• Basado-indexado: 12) [BX+SI], 13) [BX+DI], 14) [BP+SI], 15) [BX+DI].
• Basado-indexado con desplazamiento: 16) desp8[BX+SI], 17)
desp8[BX+DI], 18) desp8[BP+SI], 19) desp8[BX+DI], 20) desp16[BX+SI],
21) desp16[BX+DI], 22) desp16[BP+SI], 23) desp16[BX+DI].
• Directo: 24) [desp16].

Aquí desp8 indica desplazamiento de 8 bits y desp16 indica desplazamiento de


16 bits. Otras combinaciones no están implementadas en la CPU y generarán
error al querer ensamblar, por ejemplo, ADD CL,[DX+SI].
El ensamblador genera el tipo de desplazamiento más apropiado (0, 8 ó 16 bits)
dependiendo del valor que tenga la constante: si vale cero se utiliza el primer
caso, si vale entre -128 y 127 se utiliza el segundo, y en otro caso se utiliza el
tercero. Nótese que [BP] sin desplazamiento no existe. Al ensamblar una
instrucción como, por ejemplo, MOV AL,[BP], se generará un desplazamiento
de 8 bits con valor cero. Esta instrucción ocupa tres bytes, mientras que MOV
AL,[SI] ocupa dos, porque no necesita el desplazamiento.
Estos modos de direccionamiento producen algunos inconvenientes en el
8086/8088. La CPU gasta tiempo calculando una dirección compuesta de
varias cantidades. Principalmente esto se debe al hecho de que el cálculo de
direcciones está programado en microcódigo (dentro de la CROM del sistema de
control de la unidad de ejecución). En las siguientes versiones (a partir del
80186/80188) estos cálculos están cableados en la máquina y, por lo tanto,
cuesta mucho menos tiempo el realizarlos.
Veamos un ejemplo: MOV AL, ES:[BX+SI+6]. En este caso el operando de la
izquierda tiene direccionamiento a registro mientras que el de la derecha indica
una posición de memoria. Poniendo valores numéricos, supongamos que los
valores actuales de los registros sean: ES = 3200h, BX = 200h, SI = 38h. Como
se apuntó más arriba la dirección real de memoria será:
ES * 10h + BX + SI + 6 = 3200h * 10h + 200h + 38h + 6 = 3223Eh
Estructura de memoria de segmentación: Como se ha mencionado
anteriormente, el 8086/8088 usa un esquema ingenioso llamado segmentación,
para acceder correctamente a un megabyte completo de memoria, con
referencias de direcciones de sólo 16 bits.
Veamos cómo funciona. Cualquier dirección tiene dos partes, cada una de las
cuales es una cantidad de 16 bits. Una parte es la dirección de segmento y la otra
es el offset. A su vez el offset se compone de varias partes: un desplazamiento
(un número fijo), una base (almacenada en el registro base) y un índice
(almacenado en el registro índice). La dirección de segmento se almacena en
uno de los cuatro registros de segmento (CS, DS, ES, SS). El procesador usa
estas dos cantidades de 16 bits para calcular la dirección real de 20 bits, según la
siguiente fórmula:
Dirección real = 16 * (dirección del segmento) + offset
Tal como veíamos antes, dado que 16 en decimal es 10 en hexadecimal,
multiplicar por ese valor es lo mismo que correr el número hexadecimal a la
izquierda una posición.
Hay dos registros de segmento que tienen usos especiales: el microprocesador
utiliza el registro CS (con el offset almacenado en el puntero de instrucción IP)
cada vez que se debe acceder a un byte de instrucción de programa, mientras
que las instrucciones que utilizan la pila (llamados a procedimientos, retornos,
interrupciones y las instrucciones PUSH y POP) siempre utilizan el registro de
segmento SS (con el offset almacenado en el registro puntero de pila SP). De ahí
los nombres que toman: CS es el segmento de código mientras que SS es el
registro segmento de pila.
Para acceder a datos en la memoria se puede utilizar cualquiera de los cuatro
registros de segmento, pero uno de ellos provoca que la instrucción ocupe un
byte menos de memoria: es el llamado segmento por defecto, por lo que en lo
posible hay que tratar de usar dicho segmento para direccionar datos. Este
segmento es el DS (registro de segmento de datos) para todos los casos excepto
cuando se utiliza el registro base BP. En este caso el segmento por defecto es SS.
Si se utiliza otro registro, el ensamblador genera un byte de prefijo
correspondiente al segmento antes de la instrucción: CS -> 2Eh, DS -> 3Eh, ES
-> 26h y SS -> 36h. El uso de estos diferentes segmentos significa que hay áreas
de trabajo separadas para el programa, pila y los datos. Cada área tiene un
tamaño máximo de 64 KBytes. Dado que hay cuatro registros de segmento, uno
de programa (CS), uno de pila (SS) y dos de datos (segmento de datos DS y
segmento extra ES) el área de trabajo puede llegar a 4 * 64 KB = 256 KB en un
momento dado suponiendo que las áreas no se superponen.
Si el programa y los datos ocupan menos de 64 KB, lo que se hace es fijar los
registros de segmento al principio del programa y luego se utilizan diferentes
offsets para acceder a distintas posiciones de memoria. En caso contrario
necesariamente deberán cambiarse los registros de segmento en la parte del
programa que lo requiera. Los registros de segmento DS, ES y SS se cargan
mediante las instrucciones MOV y POP, mientras que CS se carga mediante
transferencias de control (saltos, llamadas, retornos, interrupciones)
intersegmento.
Estructura de interrupciones del 8086/8088
Hay tres clases de interrupción: por hardware, por software e internas (a las dos
últimas también se las llama "excepciones").
Veremos primeramente el caso de interrupciones por hardware: Como se
mencionó anteriormente, el 8086/8088 tiene dos entradas de petición de
interrupción: NMI e INTR y una de reconocimiento (INTA). La gran mayoría de
las fuentes de interrupción se conectan al pin INTR, ya que esto permite
enmascarar las interrupciones (el NMI no). Para facilitar esta conexión, se
utiliza el circuito integrado controlador de interrupciones, que tiene el código
8259A. Este chip tiene, entre otras cosas, ocho patas para sendas fuentes de
interrupción (IRQ0 - IRQ7), ocho para el bus de datos (D0 - D7), una salida de
INTR y una entrada de INTA. Esto permite una conexión directa con el
8088/8086. Al ocurrir una petición de alguna de las ocho fuentes, el 8259A
activa la pata INTR. Al terminar de ejecutar la instrucción en curso, el
microprocesador activa la pata INTA, lo que provoca que el 8259A envíe por el
bus de datos un número de ocho bits (de 0 a 255) llamado tipo de interrupción
(programable por el usuario durante la inicialización del 8259A), que el
8086/8088 utiliza para saber cuál es la fuente de interrupción. A continuación
busca en la tabla de vectores de interrupción la dirección del manejador de
interrupción (interrupt handler). Esto se hace de la siguiente manera. Se
multiplica el tipo de interrupción por cuatro, y se toman los cuatro bytes que se
encuentran a partir de esa dirección. Los dos primeros indican el offset y los dos
últimos el segmento del manejador, como se muestra a continuación.

Posición 00 02 04 06 08 0A 0C 0E 10 12 …… 3FC 3FE


memoria

IP CS IP CS IP CS IP CS IP CS …… IP CS
Tipo de 00 01 02 03 04 FF
Interrupción

Como se puede observar, la tabla ocupa el primer kilobyte de memoria (256


tipos * 4 bytes/tipo = 1024 bytes).
Una vez que se pusieron en la pila los flags, CS e IP (en ese orden), la CPU hace
IF Las interrupciones por software ocurren cuando se ejecuta la instrucción INT
tipo. De esta manera se pueden simular interrupciones durante la depuración de
un programa. El tipo de interrupción (para poder buscar el vector en la tabla)
aparece en la misma instrucción como una constante de 8 bits. Muchos sistemas
operativos (programas que actúan a modo de interfaz entre los programas de los
usuarios (llamados también "aplicaciones") y el hardware del sistema) utilizan
esta instrucción para llamadas a servicios, lo que permite no tener que conocer
la dirección absoluta del servicio, permitiendo cambios en el sistema operativo
sin tener que cambiar los programas que lo ejecutan. De esta manera, una de las
primeras operaciones que debe realizar dicho sistema operativo es inicializar la
tabla de vectores de interrupción con los valores apropiados.
Existen algunas interrupciones predefinidas, de uso exclusivo del
microprocesador, por lo que no es recomendable utilizar estos tipos de
interrupción para interrupciones por hardware o software.
- Tipo 0: Ocurre cuando se divide por cero o el cociente es mayor que el valor
máximo que permite el destino.
- Tipo 1: Ocurre después de ejecutar una instrucción si TF (Trap Flag) vale 1.
Esto permite la ejecución de un programa paso a paso, lo que es muy útil para la
depuración de programas.
- Tipo 2: Ocurre cuando se activa la pata NMI (interrupción no enmascarable).
- Tipo 3: Existe una instrucción INT que ocupa un sólo byte, que es la
correspondiente a este tipo. En los programas depuradores (debuggers) (tales
como Debug, CodeView, Turbo Debugger, etc.), se utiliza esta instrucción como
punto de parada (para ejecutar un programa hasta una determinada dirección,
fijada por el usuario del depurador, se inserta esta instrucción en la dirección
correspondiente a la parada y se lanza la ejecución. Cuando el CS:IP apunte a
esta dirección se ejecutará la INT 3, lo que devolverá el control del procesador al
depurador). Debido a esto, si se le ordena al depurador que ejecute el programa
hasta una determinada dirección en ROM (memoria de sólo lectura) (por
ejemplo, para ver cómo funciona una subrutina almacenada en dicha memoria),
la ejecución seguirá sin parar allí (ya que la instrucción INT 3 no se pudo
escribir sobre el programa). En el 80386, con su elaborado hardware de ayuda
para la depuración, se puede poner un punto de parada en ROM.
- Tipo 4: Ocurre cuando se ejecuta la instrucción de interrupción condicional
INTO y el flag OF (Overflow Flag) vale 1.
Los tipos 5 a 31 (1F en hexadecimal) están reservados para interrupciones
internas (también llamados "excepciones") de futuros microprocesadores.
Prioridad entre diferentes fuentes de interrupción:
1) Error de división, INT n (no enmascarable), INTO.
2) NMI (no enmascarable).
3) INTR (enmascarable mediante IF).
4) Ejecución paso a paso (enmascarable mediante TF).
BIBLIOGRAFIA
• Página de Internet: jrugeles[arroba]atenea.lasalle.edu.co
• Página de Internet: intel.com

CONTENIDO
Historia de los microprocesadores Intel
• CISC
• RISC
• Características mas importantes de los microprocesadores Intel
• Los microprocesadores 8086 y 8088
• Historia del 8086/8088
• Arquitectura de los procesadores 8088 y 8086
• Unidad aritmética lógica
• Sistema de Control de la Unidad de Ejecución
• Cola de Instrucciones
• Registros de la unidad de interfaz con el bus
• Lógica de control del bus
• Modos de direccionamiento del 8086/8088
• Estructuras de interrupciones del 8086/8088

Comentarios

El microprocesador 80286
por Dario Alejandro Alpern

Introducción

Este microprocesador apareció en febrero de 1982. Los avances de integración que


permitieron agregar una gran cantidad de componentes periféricos en el interior del
80186/80188, se utilizaron en el 80286 para hacer un microprocesador que soporte
nuevas capacidades, como la multitarea (ejecución simultánea de varios programas), lo
que requiere que los programas no "choquen" entre sí, alterando uno los datos o las
instrucciones de otros programas. El 80286 tiene dos modos de operación: modo real y
modo protegido. En el modo real, se comporta igual que un 8086, mientras que en modo
protegido, las cosas cambian completamente, como se explica a partir del próximo
párrafo. Esto necesitó un nivel de integración mucho mayor. El 80286 contiene 134.000
transistores dentro de su estructura (360% más que el 8086). Externamente está
encapsulado en formato PLCC (Plastic Leaded Chip Carrier) con pines en forma de J
para montaje superficial, o en formato PGA (Pin Grid Array), en ambos casos con 68
pines.
El microprocesador 80286 ha añadido un nuevo nivel de satisfacción a la arquitectura
básica del 8086, incluyendo una gestión de memoria con la extensión natural de las
capacidades de direccionamiento del procesador. El 80286 tiene elaboradas facilidades
incorporadas de protección de datos. Otras características incluyen todas las
características del juego de instrucciones del 80186, así como la extensión del espacio
direccionable a 16 MB, utilizando 24 bits para direccionar (224 = 16.777.216).

El 80286 revisa cada acceso a instrucciones o datos para comprobar si puede haber una
violación de los derechos de acceso. Este microprocesador está diseñado para usar un
sistema operativo con varios niveles de privilegio. En este tipo de sistemas operativos
hay un núcleo que, como su nombre indica, es la parte más interna del sistema
operativo. El núcleo tiene el máximo privilegio y los programas de aplicaciones el
mínimo. Existen cuatro niveles de privilegio. La protección de datos en este tipo de
sistemas se lleva a cabo teniendo segmentos de código (que incluye las instrucciones),
datos (que incluye la pila aparte de las variables de los programas) y del sistema (que
indican los derechos de acceso de los otros segmentos).

Para un usuario normal, los registros de segmentación (CS, DS, ES, SS) parecen tener
los 16 bits usuales. Sin embargo, estos registros no apuntan directamente a memoria,
como lo hacían en el 8086. En su lugar, apuntan a tablas especiales, llamadas tablas de
descriptores, algunas de las cuales tienen que ver con el usuario y otras con el sistema
operativo. Actualmente a los 16 bits, cada registro de segmento del 80286 mantiene
otros 57 bits invisibles para el usuario. Ocho de estos bits sirven para mantener los
derechos de acceso (sólo lectura, sólo escritura y otros), otros bits mantienen la
dirección real (24 bits) del principio del segmento y otros mantienen la longitud
permitida del segmento (16 bits, para tener la longitud máxima de 64 KB). Por ello, el
usuario nunca sabe en qué posición real de memoria está ejecutando o dónde se ubican
los datos y siempre se mantiene dentro de ciertas fronteras. Como protección adicional,
nunca se permite que el usuario escriba en el segmento de código (en modo real se
puede escribir sobre dicho segmento). Ello previene que el usuario modifique su
programa para realizar actos ilegales y potencialmente peligrosos. Hay también
provisiones para prever que el usuario introduzca en el sistema un "caballo de Troya"
que pueda proporcionarle un estado de alto privilegio.

El 80286 tiene cuatro nuevos registros. Tres de ellos apuntan a las tablas de descriptores
actualmente en uso. Estas tablas contienen información sobre los objetos protegidos en
el sistema. Cualquier cambio de privilegio o de segmento debe realizarse a través de
dichas tablas. Adicionalmente hay varios indicadores nuevos.

Existen varias instrucciones nuevas, además de las introducidas con el 80186. Todas
estas instrucciones se refieren a la gestión de memoria y protección del sistema
haciendo cosas tales como cargar y almacenar el contenido de los indicadores especiales
y los punteros a las tablas de descriptores.

Modo protegido del 80286


Debido a la complejidad del siguiente texto, para entenderlo es necesario leerlo
detenidamente. Además es necesaria una práctica de estos temas con una PC para fijar
los conocimientos.
Mecanismo de direccionamiento

Como en modo real, en modo protegido se utilizan dos componentes para formar la
dirección física: un selector de 16 bits se utiliza para determinar la dirección física
inicial del segmento, a la cual se suma una dirección efectiva (offset) de 16 bits.

La diferencia entre los dos modos radica en el cálculo de la dirección inicial del
segmento. En modo protegido el selector se utiliza para especificar un índice en una
tabla definida por el sistema operativo. La tabla contiene la dirección base de 24 bits de
un segmento dado. La dirección física se obtiene sumando la dirección base hallada en
la tabla con el offset.

Segmentación

La segmentación es un método de manejo de memoria. La segmentación provee la base


para la protección. Los segmentos se utilizan para encapsular regiones de memoria que
tienen atributos comunes. Por ejemplo, todo el código de un programa dado podría estar
contenido en un segmento, o una tabla del sistema operativo podría estar en un
segmento. Toda la información sobre un segmento se almacena en una estructura de
ocho bytes llamada descriptor. Todos los descriptores del sistema están en tablas en
memoria que reconoce el hardware.

Terminología

Los siguientes términos se utilizan en la discusión de descriptores, niveles de privilegio


y protección.

• PL (Privilege Level): Uno de los cuatro niveles jerárquicos de privilegio. El


nivel cero es el más privilegiado y el tres es el menos privilegiado. Los niveles
más privilegiados son numéricamente menores que los menos privilegiados.
También se llama anillo (ring).
Al nivel cero se lo llama anillo privilegiado (privileged ring) mientras que los
otros son los anillos no privilegiados (non-privileged ring).
• RPL (Requestor Privilege Level): Es el nivel de privilegio (PL) de la tarea que
generó inicialmente este selector. Se determina leyendo los dos bits menos
significativos del selector.
• DPL (Descriptor Privilege Level): Este es el nivel menos privilegiado para el
cual una tarea puede acceder ese descriptor (y el segmento asociado con ese
descriptor). El nivel de privilegio del descriptor se determina mediante los bits 6
y 5 en el byte de derechos de acceso del descriptor.
• CPL (Current Privilege Level): Es el nivel de privilegio en el cual una tarea está
ejecutando actualmente. Este valor es igual al nivel de privilegio del segmento
de código siendo ejecutado. El CPL también puede se puede determinar leyendo
los dos bits menos significativos del registro CS.
• EPL (Effective Privilege Level): Es el nivel menos privilegiado del RPL y DPL.
Debido a que menores valores de privilegio indican mayor privilegio, el EPL es
el máximo de RPL y DPL.
• Tarea (task): Una instancia en la ejecución de un programa. También se lo
llama proceso.
• Selector: Entidad de dos bytes que apunta a un descriptor. Contiene tres
campos:
Bit 15 ... 3 2 1 0
Campos Índice TI RPL
• El índice selecciona uno de entre 213 = 8192 descriptores.
El bit indicador de tabla (TI) especifica la tabla de descriptores a utilizar: si vale
cero se utiliza la tabla de descriptores globales, mientras que si vale uno, se
utiliza la tabla de descriptores locales.
• Descriptor: Estructura de ocho bytes que le indica al procesador el tamaño y
ubicación de un segmento, así como información de control y estado. Los
descriptores son creados por compiladores, linkers, programas cargadores, o el
sistema operativo, pero nunca por los programas de aplicación. Si bien el
tamaño de esta estructura es siempre de ocho bytes, el formato depende de la
tabla de descriptores.

Tablas de descriptores

Estas tablas definen todos los segmentos utilizados en un sistema basado en el 80286.
Hay tres tipos de tablas que mantienen descriptores: la tabla de descriptores globales o
GDT (Global Descriptor Table), la tabla de descriptores locales o LDT (Local
Descriptor Table) y la tabla de descriptores de interrupción o IDT (Interrupt Descriptor
Table). Todas las tablas son arrays de longitud variable, que pueden tener entre 8 y
65.536 bytes. Cada tabla puede mantener hasta 8192 descriptores. Los 13 bits más
significativos de un selector se usan como un índice dentro de la tabla de descriptores.
Las tablas tienen registros asociados que contienen la dirección base de 24 bits y el
límite de 16 bits de cada tabla.

Cada una de las tablas tiene un registro asociado. Estos se llaman GDTR, LDTR, IDTR
(ver las siglas en inglés que aparecen en el párrafo anterior). Las instrucciones LGDT,
LLDT y LIDT cargan (Load) la base y el límite de la tabla de descriptores globales,
locales o de interrupción, respectivamente, en el registro apropiado. Las instrucciones
SGDT, SLDT y SIDT almacenan (Store) los valores anteriormente mencionados de los
registros en memoria. Estas tablas son manipuladas por el sistema operativo, por lo que
las instrucciones de carga son instrucciones privilegiadas (sólo se ejecutan si el CPL
vale cero).

Tabla de descriptores globales (GDT)

Esta tabla contiene descriptores que están disponibles para todas las tareas del sistema.
La GDT puede contener cualquier clase de descriptores de segmento excepto los
relacionados con interrupciones. Todos los sistemas basados en el 80286 en modo
protegido contienen una GDT. Generalmente la GDT contiene los segmentos de código
y datos usados por el sistema operativo y los TSS (cuya explicación aparece más
adelante) y los descriptores para las LDT en un sistema.
La primera entrada de la GDT corresponde al selector nulo y no se usa.

Tabla de descriptores locales (LDT)


Las LDT contienen descriptores asociados con una tarea particular. Generalmente los
sistemas operativos se diseñan de forma tal que cada tarea tenga su propia LDT. La
LDT sólo puede contener descriptores de código, datos, pila, compuertas de tarea, y
compuertas de llamada. Las LDT proveen un mecanismo para aislar los segmentos de
código y datos de una tarea dada del sistema operativo y las otras tareas, mientras que la
GDT contiene descriptores comunes a todas las tareas. Una tarea no puede acceder un
segmento si no existe en la LDT actual o en la GDT. Esto permite el aislamiento y
protección de los segmentos de una tarea, mientras que los datos comunes pueden ser
compartidos por todas las tareas.

Tabla de descriptores de interrupción

La tercera tabla necesaria para sistemas 80286 que operan en modo protegido es la IDT.
Esta tabla contiene los descriptores que apuntan a la ubicación de hasta 256 rutinas de
servicio de interrupción (interrupt handlers). Debe conocerse cuál es el valor máximo
del tipo de interrupción que se va a utilizar y poner el límite del IDTR igual a ocho
veces ese valor (ya que, como se explicó anteriormente, cada descriptor ocupa ocho
bytes). Cada interrupción utilizada por el sistema debe tener una entrada propia en la
IDT. Las entradas de la IDT se referencian mediante instrucciones INT, vectores
externos de interrupción y excepciones (interrupciones internas del microprocesador).

Registros de direcciones del sistema

Como se indicó anteriormente, existen cuatro registros del 80286 que apuntan a las
tablas de descriptores.

GDTR e IDTR: Estos registros mantienen la dirección base de 24 bits y el límite de 16


bits de las tablas GDT e IDT, respectivamente. Estos segmentos, como son globales
para todas las tareas en el sistema, se definen mediante direcciones físicas de 24 bits y
límite de 16 bits.

LDTR y TR: Estos registros mantienen los selectores de 16 bits para el descriptor de
LDT y de TSS, respectivamente. Estos segmentos, como son específicos para cada
tarea, se definen mediante valores de selector almacenado en los registros de segmento
del sistema. Éste apunta a un descriptor apropiado (de LDT o TSS). Nótese que un
registro descriptor del segmento (invisible para el programador) está asociado con cada
registro de segmento del sistema.

Descriptores

A continuación se brinda una descripción detallada de los contenidos de los descriptores


utilizados en el microprocesador 80286 operando en modo protegido.

Bits de atributo del descriptor

El objeto apuntado por el selector se llama descriptor. Los descriptores son cantidades
de ocho bytes que contienen atributos sobre una región de memoria (es decir, un
segmento). Estos atributos incluyen la dirección base de 24 bits, la longitud de 16 bits,
el nivel de protección (de 0 a 3), permisos de lectura, escritura o ejecución (esto último
para segmentos de código), y el tipo de segmento. A continuación se muestra el formato
general de un descriptor.

• Byte 0: Límite del segmento (bits 7-0).


• Byte 1: Límite del segmento (bits 15-8).
• Byte 2: Dirección base del segmento (bits 7-0).
• Byte 3: Dirección base del segmento (bits 15-8).
• Byte 4: Dirección base del segmento (bits 23-16).
• Byte 5: Derechos de acceso del segmento.
• Bytes 6 y 7: No utilizados (deben valer cero para lograr la compatibilidad con
80386 y posteriores).

El byte de derechos de acceso es el que define qué clase de descriptor es. El bit 4 (S)
indica si el segmento es de código o datos (S = 1), o si es del sistema (S = 0). Veremos
el primer caso.

• Bit 7: Presente (P). Si P = 1 el segmento existe en memoria física, mientras que


si P = 0 el segmento no está en memoria. Un intento de acceder un segmento que
no está presente cargando un registro de segmento (CS, DS, ES o SS) con un
selector que apunte a un descriptor que indique que el segmento no está
presente generará una excepción 11 (en el caso de SS se generará una excepción
12 indicando que la pila no está presente). El manejador de la interrupción 11
deberá leer el segmento del disco rígido. Esto sirve para implementar memoria
virtual.
• Bits 6 y 5: Nivel de privilegio del descriptor (DPL): Atributo de privilegio del
segmento utilizado en tests de privilegio.
• Bit 4: Bit descriptor del segmento (S): Como se explicó más arriba, este bit
vale 1 para descriptores de código y datos.
• Bit 3: Ejecutable (E): Determina si el segmento es de código (E = 1), o de datos
(E = 0).
Si el bit 3 vale cero:
o Bit 2: Dirección de expansión (ED): Si E = 0, el segmento se expande
hacia arriba, con lo que los offsets deben ser menores o iguales que el
límite. Si E = 1, el segmento se expande hacia abajo, con lo que los
offsets deben ser mayores que el límite. Si no ocurre esto se genera una
excepción 13 (Fallo general de protección) (en el caso de la pila se
genera una excepción 12).
o Bit 1: Habilitación de escritura (W): Si W = 0 no se puede escribir
sobre el segmento, mientras que si W = 1 se puede realizar la escritura.

Si el bit 3 vale uno:

o Bit 2: Conforme (C): Si C = 1, el segmento de código sólo puede ser


ejecutado si CPL es mayor que DPL y CPL no cambia. Los segmentos
conformes sirven para rutinas del sistema operativo que no requieran
protección, tales como rutinas matemáticas, por ejemplo.
o Bit 1: Habilitación de lectura (R): Si R = 0, el segmento de código no
se puede leer, mientras que si R = 1 sí. No se puede escribir sobre el
segmento de código.
• Bit 0: Accedido (A): Si A = 0 el segmento no fue accedido, mientras que si A =
1 el selector se ha cargado en un registro de segmento o utilizado por
instrucciones de test de selectores. Este bit es puesto a uno por el
microprocesador.

Si se lee o escribe en un segmento donde no está permitido o se intenta ejecutar en un


segmento de datos se genera una excepción 13 (Violación general de protección). Si
bien no se puede escribir sobre un segmento de código, éstos se pueden inicializar o
modificar mediante un alias. Los alias son segmentos de datos con permiso de escritura
(E = 0, W = 1) cuyo rango de direcciones coincide con el segmento de código.

Los segmentos de código cuyo bit C vale 1, pueden ejecutarse y compartirse por
programas con diferentes niveles de privilegio (ver la sección sobre protección, más
adelante).

A continuación se verá el formato del byte de derechos de acceso para descriptores de


segmentos del sistema:

• Bit 7: Presente (P): Igual que antes.


• Bits 6 y 5: Nivel de privilegio del descriptor (DPL): Igual que antes.
• Bit 4: Bit descriptor del segmento (S): Como se explicó más arriba, este bit
vale 0 para descriptores del sistema.
• Bits 3-0: Tipo de descriptor: En el 80286 están disponibles los siguientes:
0000: Inválido 0100: Compuerta de llamada
0001: TSS disponible 0101: Compuerta de tarea
0010: LDT 0110: Compuerta de interrupción
0011: TSS ocupado 0111: Compuerta de trampa
• Los otros ocho tipos están reservados para el procesador 80386 y posteriores.

Como se pudo observar hay atributos en común entre los distintos descriptores: P, DPL
y S.

Ahora se verá con más detalle los diferentes descriptores del sistema.

• Descriptores de LDT (S = 0, tipo = 2): Contienen información sobre tablas de


descriptores locales. Las LDT contienen una tabla de descriptores de segmentos,
únicos para cada tarea. Como la instrucción para cargar el registro LDTR sólo
está disponible en el nivel de privilegio 0 (nivel más privilegiado), el campo
DPL es ignorado. Los descriptores de LDT sólo se permiten en la tabla de
descriptores globales (GDT).
• Descriptores de TSS (S = 0, tipos = 1, 3): Un descriptor de segmento de estado
de la tarea (TSS: Task State Segment) contiene información sobre la ubicación,
el tamaño y el nivel de privilegio de un TSS. Un TSS es un segmento especial
con formato fijo que contiene toda la información sobre el estado de una tarea y
un campo de enlace para permitir tareas anidadas. El campo de tipo se usa para
indicar si la tarea está ocupada (tipo = 3), es decir, en una cadena de tareas
activas, o si el TSS está disponible (tipo = 1). El registro de tarea (TR: Task
Register) contiene el selector que apunta al TSS actual dentro de la GDT.
• Descriptores de compuertas (tipos = 4 a 7): Las compuertas se utilizan para
controlar el acceso a puntos de entrada dentro del segmento de código objetivo.
Los distintos tipos de compuerta son: de llamada (call gate), de tarea (task gate),
de interrupción (interrupt gate) y de trampa (trap gate). Las compuertas proveen
un nivel de indirección entre la fuente y el destino de la transferencia de control.
Esta indirección permite al procesador realizar automáticamente verificaciones
de protección. También permite a los diseñadores controlar los puntos de
entrada a los sistemas operativos. Las compuertas de llamada se utilizan para
cambiar niveles de privilegio (ver la sección que trata sobre privilegio, más
adelante), las compuertas de tarea se utilizan para hacer cambios de tarea y las
de interrupción y de trampa se utilizan para especificar rutinas de servicio de
interrupción.

A continuación se muestra el formato de los descriptores de compuertas, que


difieren del formato general:

o Byte 0: Offset (bits 7-0).


o Byte 1: Offset (bits 15-8).
o Byte 2: Selector (bits 7-0).
o Byte 3: Selector (bits 15-0).
o Byte 4: Bits 4-0: Cantidad de palabras, bits 7-5: Cero.
o Byte 5: Derechos de acceso.
o Bytes 6 y 7: No usados (deben valer cero para lograr la compatibilidad
con los procesadores 80386 y posteriores).

Las compuertas de llamado se utilizan para transferir el control del programa a


un nivel más privilegiado. El descriptor correspondiente consiste en tres campos:
el byte de derechos de acceso, un puntero largo (selector y offset) y una cantidad
de palabras que especifica cuántos parámetros deben copiarse de la pila de la
rutina llamadora a la pila de la rutina llamada. Este campo sólo es utilizado por
las compuertas de llamada cuando hay un cambio de nivel de privilegio (PL).
Los otros tipos de compuertas ignoran el campo de cantidad de palabras.

Las compuertas de interrupción y de trampa utilizan los campos de selector y


offset como un puntero al inicio de la rutina que maneja la interrupción o
trampa. La diferencia entre ambos tipos de compuertas es que la de interrupción
deshabilita las interrupciones (IF <- 0), mientras que la de trampa no altera IF.

Las compuertas de tarea se usan para cambiar tareas. Las compuertas de tarea
sólo se pueden referir a un TSS y por lo tanto sólo se utiliza el campo del
selector, siendo ignorado el de offset.

Se genera una excepción 13 (Violación general de protección) si un selector no se


refiere a un tipo de descriptor correcto (un segmento de código para una compuerta de
interrupción, trampa o llamada y un segmento de estado de tarea para la compuerta de
tarea).

Caché del descriptor del segmento

Aparte del valor del selector, cada registro de segmento tiene un registro caché de
descriptor del segmento invisible para el programador. Al cargar un registro de
segmento con un nuevo selector, el descriptor de ocho bytes asociado con ese selector
se carga automáticamente en el chip. Una vez que se hizo esto, todas las referencias a
ese segmento utilizan la información almacenada en el caché en vez de volver a acceder
el descriptor. Como los cachés de los descriptores sólo varían cuando se carga un
registro de segmento, los programas que deben modificar las tablas de descriptores
deben volver a cargar los registros de segmento apropiados después de cambiar el valor
de un descriptor.

Contenido de los cachés descriptores de segmento: El contenido varía dependiendo


del modo en que opera el 80286. En modo protegido, como se explicó más arriba, los
cachés se cargan con la información de los descriptores. En modo real, el contenido no
se obtiene de la memoria, sino que toma unos valores fijos para lograr compatibilidad
con el 8086. La base generada es 16 veces el valor del selector, el límite siempre es
FFFFh, el bit P (presente) vale 1, el nivel de privilegio es cero (máximo privilegio), el
bit de dirección de expansión indica que los offsets deben ser menores o iguales que el
límite y están habilitados los permisos de lectura, escritura y ejecución. Todo esto hace
que en modo real no se pueda acceder a los 16 MB de capacidad de direccionamiento
del 80286, ya que el valor máximo ocurre cuando el selector vale FFFFh y el offset
también, con lo que se logra una dirección máxima de FFFF0h + FFFFh = 10FFEFh
(casi 1088 KB).

Protección

El 80286 tiene cuatro niveles de protección que están optimizados para soportar las
necesidades de los sistemas operativos multitarea para aislar y proteger los programas
de un usuario de otros y del sistema operativo. Los niveles de privilegio controlan el uso
de instrucciones privilegiadas, instrucciones de entrada/salida, y el acceso a segmentos
y descriptores de segmento. A diferencia de los sistemas tradicionales basados en
microprocesadores donde esta protección sólo se logra a través de un hardware externo
muy complejo con el correspondiente software, el 80286 provee esta protección como
parte de la unidad de manejo de memoria (MMU: Memory Management Unit)
incorporada.

El sistema de privilegio jerárquico de cuatro niveles es una extensión de los modos


usuario/supervisor que se encuentran comúnmente en minicomputadoras. Los niveles de
privilegio (PL: Privilege Level) se numeran de 0 a 3, siendo el 0 el nivel más
privilegiado (más confiable).

Ejemplo de los niveles jerárquicos:

• PL = 0: Kernel (parte del sistema operativo).


• PL = 1: Servicios del sistema (parte del SO).
• PL = 2: Extensiones del sistema operativo.
• PL = 3: Aplicaciones.

Reglas de privilegio

El 80286 controla el acceso a los datos y procedimientos (o subrutinas) entre niveles de


una tarea, de acuerdo a las siguientes reglas:
• Los datos almacenados en un segmento con nivel de privilegio P pueden ser
accedidos solamente por código que se ejecuta a un nivel de privilegio por lo
menos tan privilegiado como P.
• Un segmento de código/procedimiento con nivel de privilegio P sólo puede ser
llamado por una tarea que se ejecuta al mismo o menor privilegio que P.

Privilegio de una tarea

En un momento determinado, una tarea en el 80286 se ejecuta en uno de los cuatro


niveles de privilegio. Esto está especificado por el nivel de privilegio actual (CPL). El
CPL de una tarea sólo puede cambiarse mediante transferencias de control utilizando los
descriptores de compuerta a un segmento de código con un nivel de privilegio diferente.
Por ejemplo, un programa de aplicación corriendo con PL = 3 puede llamar una rutina
del sistema operativo con PL = 1 (mediante una compuerta) que causaría que CPL = 1
hasta que finalice la rutina del sistema operativo.

Nivel de privilegio del selector (RPL)

El nivel de privilegio de un selector se especifica en el campo RPL. El RPL está


formado por los dos bits menos significativos del selector. Se utiliza para que un nivel
de privilegio menos confiable que el nivel de privilegio actual (CPL) pueda utilizar
dicho selector. Este nivel se llama nivel de privilegio efectivo (EPL) de la tarea, que se
define como el nivel menos privilegiado (numéricamente mayor) del CPL de la tarea y
el RPL del selector. Así, si RPL = 0, entonces CPL siempre especifica el nivel de
privilegio para realizar un acceso usando el selector, mientras que si RPL = 3, entonces
el selector sólo puede acceder segmentos de nivel 3 independientemente del valor de
CPL de la tarea. El RPL se utiliza generalmente para verificar que los punteros pasados
a un procedimiento del sistema operativo no accede datos que son de mayor privilegio
que el procedimiento que originó el puntero. Como dicho procedimiento puede
especificar cualquier valor de RPL, la instrucción de ajuste de RPL (ARPL) se utiliza
para forzar los bits de RPL a que sean iguales al CPL de la rutina que generó el selector.

Privilegio de entrada/salida

El nivel de privilegio de entrada/salida (IOPL, que ocupa los bits 13 y 12 del registro de
indicadores) define el nivel menos privilegiado para el cual se pueden realizar
instrucciones de I/O (IN, OUT, INS, OUTS, REP INS, REP OUTS). Si CPL > IOPL,
al ejecutar alguna de estas instrucciones se generará una excepción 13. IOPL también
afecta otras instrucciones, como STI, CLI y el prefijo LOCK. Además afecta si IF
(indicador de interrupciones) puede cambiarse cargando un valor en el registro de
indicadores (mediante POPF). Si CPL es menor o igual que IOPL, entonces IF se
puede cambiar. Si CPL > IOPL el valor de IF no varía mediante la ejecución de la
instrucción POPF (en este caso no se genera ninguna excepción).

Validación de privilegio

El 80286 provee algunas instrucciones para acelerar la verificación de punteros y


mantener la integridad del sistema comprobando que el valor del selector se refiera a un
segmento apropiado.
La verificación de punteros previene el problema común de una aplicación con PL = 3
que llama a un rutina del sistema operativo con PL = 0 pasándole un puntero "erróneo"
que corrompe una estructura de datos que pertenece al sistema operativo. Si éste
utilizara la instrucción ARPL para asegurar que el RPL del selector no tiene mayor
privilegio que la rutina llamadora, este problema podría evitarse.

Las instrucciones para verificar punteros son ARPL, VERR, VERW, LSL y LAR.
Todas estas instrucciones ponen el indicador de cero a uno si la verificación se pudo
realizar; si no se puede realizar pone ZF <- 0, en vez de generar una excepción 13 como
hace con otras instrucciones.

Acceso a descriptores

Básicamente hay dos tipos de accesos de segmentos: aquéllos que se refieren a los
segmentos de código como las transferencias de control, y aquéllos que se refieren a
segmentos de datos. Para determinar si una tarea puede acceder un segmento se necesita
conocer el tipo de segmento a acceder, las instrucciones utilizadas, el tipo de descriptor
utilizado y los CPL, RPL y DPL, como se describió más arriba.
Cada vez que una instrucción carga los registros de segmentos de datos (DS, ES), el
80286 hace validaciones de protección. Los selectores almacenados en esos registros
sólo pueden referirse a segmentos de datos o segmentos de código con habilitación de
lectura. Las reglas de accesos de datos se especificaron anteriormente. La única
excepción a estas reglas la constituye el segmento de código legible con el bit C = 1 de
los derechos de acceso que se puede acceder desde cualquier nivel.
Finalmente se realizan las verificaciones de privilegio. El CPL se compara con EPL y si
EPL es más privilegiado que CPL se genera una excepción 13 (Violación general de
protección).
Las reglas para el segmento de pila son ligeramente diferentes que aquéllos referidos a
los segmentos de datos. Las instrucciones que cargan los selectores en SS deben
referirse a descriptores de segmentos de datos con habilitación de escritura (ya que la
pila debe poder ser leída y escrita). El DPL y RPL deben ser iguales al CPL. Cualquier
otro tipo de descriptor o una violación de privilegio causará una excepción 13. Si el
segmento de pila está marcado como no presente (P = 0) se genera una excepción 12. La
excepción 11 ocurre en el caso de segmentos de código o datos no presentes.

Transferencias de nivel de privilegio

Las transferencias de control intersegmento ocurren cuando se carga un selector en el


registro CS. Para un sistema típico la mayoría de esas transferencias ocurren
simplemente como resultado de una llamada o un salto a otra rutina. Hay cinco tipos de
control de transferencia que se resumen a continuación. Varias de estas transferencias
resultan en un cambio de nivel de privilegio. El cambio de niveles de privilegio sólo se
puede efectuar mediante compuertas y cambios de tarea.

Los tipos de descriptores que se usan para transferencia de control son los siguientes:

Tipos de transferencia Operaciones que Descriptor que se Tabla de


de control la generan referencia descriptores
que se utiliza para
realizar la
transferencia
JMP
Transferencia de control CALL
Segmento de GDT
intersegmento dentro del RET
código LDT
mismo nivel de privilegio IRET (sólo si el
flag NT vale 0)
Transferencia de control
Compuerta de GDT
intersegmento al mismo o CALL
llamada LDT
mayor nivel de privilegio
INT
Transferencia de control Compuerta de Tabla de
excepción
intersegmento al mismo o interrupción o descriptores de
interrupción
mayor nivel de privilegio trampa interrupción
externa
Transferencia de control RET
Segmento de GDT
intersegmento al mismo o IRET (sólo si el
código LDT
menor nivel de privilegio flag NT vale 0)
Cambio de tarea a través del CALL Segmento de Tabla de
segmento de estado de tarea JMP estado de la tarea descriptores globales
Cambio de tarea a través de CALL Compuerta de GDT
una compuerta de tarea JMP tarea LDT
Tabla de
Cambio de tarea a través de IRET (sólo si el Compuerta de
descriptores de
una compuerta de tarea flag NT vale 1) tarea
interrupción

Las transferencias de control sólo pueden ocurrir si la operación que cargó el selector se
refiere al tipo correcto de descriptor. Cualquier violación de estas reglas causará una
excepción 13 (por ejemplo, un salto a través de una compuerta de llamado, o un IRET
desde una subrutina de interrupción).

Para que el sistema sea aún más seguro, todas las transferencias de control también se
sujetan a las reglas de privilegio, que indican lo siguiente:

• Las transiciones de nivel de privilegio sólo ocurren a través de las compuertas.


• Los saltos (JMP) pueden realizarse a segmento de código no conformes con el
mismo nivel de privilegio o a segmento de código conformes con mayor o igual
privilegio.
• Las llamadas (CALL) pueden realizarse a segmentos de código no conformes
con el mismo nivel de privilegio o a través de una compuerta a un nivel más
privilegiado.
• Las interrupciones que se manejan dentro de una tarea se manejan de la misma
manera que las llamadas CALL.
• Los segmentos de código conformes son accesibles por niveles de privilegio que
tienen el mismo o menor privilegio que el DPL (Descriptor Privilege Level) de
ese segmento de código.
• El RPL (Requested Privilege Level) en el selector que apunta a una compuerta y
el CPL (Current Privilege Level) de la tarea deben tener igual o mayor privilegio
que el DPL (Descriptor Privilege Level) de la compuerta.
• El segmento de código seleccionado en la compuerta debe tener el mismo o
mayor privilegio que el CPL (Current Privilege Level) de la tarea.
• Las instrucciones de retorno que no cambian tareas sólo pueden retornar el
control a un segmento de código con el mismo o menor privilegio.
• Los cambios de tarea se realizan mediante instrucciones CALL, JMP o INT
que referencian a una compuerta de tarea o un segmento de estado de tarea cuyo
DPL (Descriptor Privilege Level) tiene el mismo o menos privilegio que el CPL
(Current Privilege Level) de la vieja tarea.

Todas las transferencias de control que cambian CPL dentro de la misma tarea causan
un cambio de pilas como resultado del cambio de privilegio. Los valores iniciales de
SS:SP para los niveles de privilegio 0, 1 y 2 se almacenan en el segmento de estado de
tarea (ver más abajo el formato de dicho segmento). Durante la ejecución de JMP o
CALL, el nuevo puntero de pila se carga en los registros SS y SP y el puntero previo se
pone en la nueva pila.

Al retornar al nivel de privilegio original, el uso de la pila menos privilegiada se


restaura como parte de la ejecución de la instrucción RET o la IRET. Para subrutinas
que pasan parámetros en la pila y cruzan niveles de privilegio, se copia un número fijo
de palabras (especificado en el campo de cuenta de palabras de la compuerta) de la pila
previa a la actual. La instrucción RET intersegmento con un valor de ajuste del puntero
de pila ajusta correctamente el SP al efectuar el retorno.

Compuertas de llamado: Estas compuertas proveen llamadas (CALL) indirectas, en


forma protegida. Uno de los usos más importantes de las compuertas es poder tener un
método seguro de transferencias de privilegio dentro de una tarea. Como el sistema
operativo define todas las compuertas en el sistema, puede asegurar que todas las
compuertas permiten el acceso sólo a los procedimientos confiables (como aquéllos que
realizan manejo de memoria u operaciones de entrada/salida). Un intento de acceso a
otro lugar causará una excepción 13 (Violación general de protección).

Los descriptores de compuertas siguen las mismas reglas de privilegio que los datos,
esto es, una tarea puede acceder una compuerta sólo si el EPL (Effective Privilege
Level) es igual o más privilegiado que el DPL (Descriptor Privilege Level). Las
compuertas siguen las reglas de privilegio de las transferencias de control y por lo tanto
sólo pueden transferir el control a un nivel más privilegiado.

Las compuertas de llamada se acceden mediante una instrucción CALL y son


sintácticamente idénticas a la llamada a una subrutina normal. Cuando se activa una
llamada que cambia el nivel de privilegio, suceden las siguientes acciones:

1) Cargar CS:IP de la compuerta y verificar la validez.


2) Poner el viejo SS en la nueva pila.
3) Poner el viejo SP en la nueva pila.
4) Copiar la cantidad de parámetros de 16 bits como se indica en el campo de cuenta de
palabras de la compuerta de la vieja a la nueva pila.
5) Poner la dirección de retorno en la pila.

Las compuertas de interrupción y de trampa trabajan de la misma forma que las


compuertas de llamada, excepto que no hay copia de parámetros. La única diferencia
entre las compuertas de interrupción y de trampa es que las primeras deshabilitan las
interrupciones (IF <- 0), mientras que las otras no alteran el indicador de interrupciones
IF.

Cambio de tareas

Un atributo muy importante de cualquier sistema operativo multitarea/multiusuario es


su habilidad para cambiar rápidamente entre tareas o procesos. El 80286 soporta esta
operación incluyendo una instrucción de cambio de tarea en el hardware. Dicha
instrucción salva el estado entero de la máquina (todos los registros, espacio de
direcciones y un puntero a la tarea anterior), carga un nuevo estado de ejecución, realiza
verificaciones de protección y comienza la ejecución en menos de 20 microsegundos.
Al igual que la transferencia de control por compuertas, la operación de cambio de
tareas se invoca ejecutando una instrucción JMP o CALL intersegmento que se refiere
a un segmento de estado de la tarea (TSS) o un descriptor de compuerta de tarea en el
GDT (Global Descriptor Table) o en el LDT (Local Descriptor Table). Una instrucción
INT n, una excepción, trampa o interrupción externa puede también invocar la
operación de cambio de tarea si hay un descriptor de compuerta de tarea en la entrada
correspondiente de la IDT (Interrupt Descriptor Table).

Segmento de estado de la tarea

El descriptor TSS apunta a un segmento que contiene el estado de la ejecución de 80286


mientras que un descriptor de compuerta de tarea contiene un selector de TSS.
El límite (cantidad de bytes que ocupa) del segmento debe ser mayor o igual a 2Ch = 44
bytes. Si es mayor, en el espacio adicional del segmento TSS, el sistema operativo
puede almacenar información adicional acerca de las razones por la que la tarea está
inactiva, el tiempo que la tarea estuvo corriendo, los archivos abiertos que pertenecen a
esa tarea, etc.

El formato del TSS es como sigue:

00: Puntero selector del TSS


02: SP para CPL = 0
04: SS para CPL = 0
06: SP para CPL = 1
08: SS para CPL = 1
0A: SP para CPL = 2
0C: SS para CPL = 2
0E: IP (Punto de entrada)
10: Flags
12: Registro AX
14: Registro CX
16: Registro DX
18: Registro BX
1A: Registro SP
1C: Registro BP
1E: Registro SI
20: Registro DI
22: Selector ES
24: Selector CS
26: Selector SS
28: Selector DS
2A: Selector LDT de la tarea
2C: Disponible

Cada tarea debe tener un TSS asociado. El TSS actual se identifica mediante un registro
especial en el 80286 llamado TR (Task State Segment Register). Este registro contiene
un selector que se refiere al descriptor de TSS de la tarea. Un registro de base y límite
del segmento (invisible para el programador) asociado con TR se carga cada vez que
TR se carga con un nuevo selector. El retorno de una tarea se realiza mediante la
instrucción IRET. Cuando se ejecuta IRET, el control retorna a la tarea que había sido
interrumpida. El estado de la tarea que se está ejecutando se almacena en el TSS y el
estado de la vieja tarea se restaura de su propio TSS. Algunos bits en el registro de
indicadores y la palabra de estado de la máquina (MSW) dan información sobre el
estado de una tarea que son útiles para el sistema operativo. El bit 14 del registro de
indicadores (NT = Nested Task) controla la función de la instrucción IRET. Si NT = 0,
dicha instrucción realiza un retorno normal, pero si NT = 1, IRET realiza una operación
de cambio de tarea para volver a ejecutar la tarea anterior. El bit NT se pone a cero o
uno de la siguiente manera: cuando una instrucción CALL o INT inicia un cambio de
tarea, el nuevo TSS se marca como ocupado y el puntero del nuevo TSS se carga con el
selector del viejo TSS. El bit NT de la nueva tarea se pone entonces a 1. Una
interrupción que no causa un cambio de tareas pondrá a cero el bit NT (el bit NT será
restaurado a su valor anterior luego de la ejecución del manejador de interrupciones). El
bit NT también puede ser afectado por las instrucciones POPF o IRET.

El segmento de estado de la tarea (TSS) se marca como ocupado cambiando el campo


de tipo de descriptor de tipo 1 a tipo 3. El uso de un selector que referencia un TSS
ocupado resultará en una excepción 13 (Violación general de protección).

El estado del coprocesador no se salva automáticamente cuando ocurre un cambio de


tareas, porque la nueva tarea puede no utilizar instrucciones del coprocesador. El bit 3
del MSW llamado TS (Task Switched) ayuda en esta situación. Cuando el
microprocesador realiza un cambio de tarea, pone a uno el flag TS. El 80286 detecta el
primer uso de una instrucción de coprocesador después del cambio de tarea y provoca
una excepción 7 (Coprocesador inexistente). El manejador de la excepción puede
entonces decidir si debe salvar el estado del coprocesador. Dicha excepción ocurre
cuando se trata de ejecutar una instrucción ESC o WAIT (es decir, alguna referida al
coprocesador) y los bits Task Switched y Monitor coprocessor extension están ambos a
uno (es decir, TS = MP = 1).

Inicialización y transición a modo protegido

Como el 80286 comienza la ejecución (después de activar el pin RESET) en modo real,
es necesario inicializar las tablas del sistema y los registros con los valores apropiados.
Los registros GDTR e IDTR deben referirse a tablas de descriptores globales y de
interrupción (respectivamente) que sean válidas.

Para entrar en modo protegido debe ponerse el bit PE (bit 0 de MSW) a 1 utilizando la
instrucción LMSW. Después de entrar en modo protegido, la siguiente instrucción
deberá ser un JMP intersegmento para cargar el registro CS y liberar la cola de
instrucciones. El paso final es cargar todos los registros de segmentos de datos con los
valores iniciales de los selectores.

Una forma alternativa de entrar en modo protegido que es especialmente apropiada en


sistemas operativos multitarea consiste en realizar un cambio de tarea para cargar todos
los registros. En este caso la GDT contendría dos descriptores de TSS además de los
descriptores de código y datos necesarios para la primera tarea. La primera instrucción
JMP en modo protegido saltaría al TSS causando un cambio de tarea y cargando todos
los registros con los valores almacenados en el TSS. El registro TR (Task State
Segment Register) deberá apuntar un descriptor de TSS válido ya que un cambio de
tarea almacena el estado de la tarea actual en el TSS apuntado por TR.

Nuevas instrucciones del 80286

Aparte de las instrucciones del 8086/8088 y las nuevas del 80186, el 80286 posee
nuevas instrucciones. Éstas corresponden todas al modo protegido y son las siguientes:

ARPL dest, src (Adjust Requested Privilege Level of selector): Compara los bits RPL
de dest contra src. Si el RPL de dest es menor que el RPL de src, los bits RPL del
destino se cargan con los bits RPL de src y el indicador ZF se pone a uno. En caso
contrario ZF se pone a cero. Ver nota 1.

CLTS (Clear Task Switched Flag): Pone a cero el indicador TS (bit 3 de la palabra de
control de la máquina MSW). Ver nota 2.

LAR dest, src (Load Access Rights): El byte más alto del registro destino se carga con
el byte de derechos de acceso del segmento indicado por el selector almacenado en src.
Pone ZF a uno si se puede realizar la carga. Ver notas 1 y 3.

LGDT mem64 (Load Global Table register): Carga el valor del operando en el registro
GDTR. Antes de ejecutar esta instrucción la tabla debe estar en memoria. Ver nota 2.

LIDT mem64 (Load Interrupt Table register): Carga el valor del operando en el registro
IDTR. Antes de ejecutar esta instrucción la tabla debe estar en memoria. Ver nota 2.

LLDT {reg16|mem16} (Load Local Descriptor Table Register): Carga el selector


indicado por el operando en el registro LDTR. Antes de ejecutar esta instrucción la tabla
deberá estar en memoria. Ver notas 1 y 2.

LMSW {reg16|mem16} (Load Machine Status Word): Carga el valor del operando en la
palabra de estado de la máquina MSW. El bit PE (bit 0) no puede ser puesto a cero por
esta instrucción, por lo que una vez que se cambió a modo protegido, la única manera
de volver a modo real es mediante un RESET del microprocesador. Ver nota 2.

LSL dest, src (Load Segment Limit): Carga el límite del segmento de un selector
especificado en src en el registro destino si el selector es válido y visible en el nivel de
privilegio actual. Si ocurre lo anterior el indicador ZF se pone a uno, en caso contrario,
se pone a cero. Ver notas 1 y 3.
LTR {reg16|mem16} (Load Task Register): Carga el selector indicado por el operando
en el registro TR. El TSS (Task State Segment) apuntado por el nuevo TR deberá ser
válido. Ver notas 1 y 2.

SGDT mem64 (Store Global Descriptor Table register): Almacena el contenido del
registro GDTR en el operando especificado.

SIDT mem64 (Store Interrupt Descriptor Table register): Almacena el contenido del
registro IDTR en el operando especificado.

SLDT {reg16|mem16} (Store Global Descriptor Table register): Almacena el contenido


del registro LDTR (que es un selector a la tabla de descriptores globales) en el operando
especificado. Ver nota 1.

SMSW {reg16|mem16} (Store Machine Status Word): Almacena la palabra de estado


de la máquina MSW en el operando especificado. Ver nota 2.

STR {reg16|mem16} (Store Task Register): Almacena el registro de tarea actual


(selector a la tabla de descriptores globales) en el operando especificado. Ver nota 1.

VERR/VERW {reg16|mem16} (Verify Read/Write): Verifica si el selector de segmento


especificado en el operando es válido y se puede leer/escribir en el nivel de privilegio
actual. En este caso se pone ZF a uno, en caso contrario se pone ZF a cero. Ver notas 1
y 3.

Notas:

1) Si se ejecuta en modo real ocurre una excepción 6 (Código de operación inválido).

2) Si se ejecuta en modo protegido en alguno de los anillos 1-3 ocurre una excepción 13
(Violación general de protección).

3) Cualquier violación de privilegio del selector indicado en el operando no causa una


excepción 13, en vez

Intel 80286
De Wikipedia, la enciclopedia libre

(Redirigido desde 80286)


Saltar a navegación, búsqueda
286
CPU
Intel 80280 a 10 MHz

Producción: Desde 1982


hasta 1986

Fabricantes:

• Intel
• AMD
• Harris Corporation

• Siemens AG
Velocidad de CPU: 6 MHz a 25
MHz
Procesos: 1.5 µm
(Longitud de canal del
MOSFET)
Conjunto de x86
instrucciones:
Socket: PLCC de 68
pines

AMD 80286 a 12 MHz.


Harris 80286 a 16 MHz.

Siemens 80286 a 10 MHz.

El Intel 80286 (llamado oficialmente iAPX 286, también conocido como i286 o 286) es
un microprocesador de 16 bits de la familia x86, que fue lanzado al mercado por Intel el
1 de febrero de 1982. Cuenta con 134.000 transistores. Las versiones iniciales del i286
funcionaban a 6 y 8 MHz, pero acabó alcanzando una velocidad de hasta 25 MHz. Fue
el microprocesador elegido para equipar al IBM Personal Computer/AT, lo que causó
que fuera el más empleado en los compatibles PC (más propiamente compatibles AT)
entre mediados y finales de los años 80 .

Tras las versiones iniciales a 6 y 8 MHz, Intel lanzó un modelo a 12,5 MHz. AMD y
Harris ampliaron esa velocidad a 20 MHz y 25 MHz, respectivamente. En promedio, el
80286 tenía una velocidad de unas 0,21 instrucciones por ciclo de reloj.1 El modelo de 6
MHz operaba a 0,9 MIPS, el de 10 MHz a 1,5 MIPS, y el de 12 MHz a 2,66 MIPS.2

El rendimiento del 80286 es más del doble que el de sus predecesores (los Intel 8086 e
Intel 8088) por ciclo de reloj. De hecho, el aumento de rendimiento por ciclo de reloj
puede ser el mayor entre las diferentes generaciones de procesadores x86. El cálculo de
los modos de direccionamiento más complejos (como base + índice) utilizaban menos
ciclos de reloj porque eran realizados por un circuito especial en el 286; el 8086, ha de
realizar el cálculo de la dirección efectiva en la ULA general, lo que consume muchos
ciclos. Además, operaciones matemáticas complejas (como MUL/DIV) ocupan menos
ciclos que en el 8086.
Al tener un bus de direcciones de 24 bits, es capaz de direccionar hasta 16 MB (16
MiB) de memoria RAM, mientras que el 8086 sólo puede 1 MB. Aunque MS-DOS
puede utilizar la RAM adicional ( memoria extendida ) mediante una llamada a la BIOS
INT 15h, AH=87h), como disco RAM o mediante emulación de memoria expandida
previamente habilitada mediante software la memoria extendida, pocos ordenadores
basados en el i286 tuvieron más de 1 MB de memoria.

El i286 fue diseñado para ejecutar aplicaciones multitarea, incluyendo comunicaciones


(como PBX automatizadas), control de procesos en tiempo real y sistemas multiusuario.
Para ello se le añadió un modo protegido, en el cual existían cuatro anillos de ejecución
y división de memoria mediante tablas de segmentos. En este modo trabajaban las
versiones de 16 bits del sistema operativo OS/2. En este modo protegido se permitía el
uso de toda la memoria directamente, y que además ofrecía protección entre
aplicaciones para evitar la escritura de datos accidental (o malintencionada) fuera de la
zona de memoria asignada. Sin embargo, una vez que el procesador entraba en el modo
protegido, no podía volver al modo real sin resetear el procesador. El microcontrolador
Intel 8042, utilizado para controlar el teclado en los AT, tiene una función que resetea
sólo la CPU (la famosa combinación CTRL - ALT - DEL).

A pesar de su gran popularidad, hoy en día quedan pocos ordenadores con el i286
funcionando.

El sucesor del i286 fue el Intel 80386, de 32 bits.

Cap�tulo III: Microprocesadores 8086/88, 286, 386, 486 y Pentium.

3.1. - CARACTER�STICAS GENERALES.

Los microprocesadores Intel 8086 y 8088 se desarrollan a partir de un procesador


anterior, el 8080, que, en sus diversas encarnaciones -incluyendo el Zilog Z-80- ha sido
la CPU de 8 bits de mayor �xito.

Poseen una arquitectura interna de 16 bits y pueden trabajar con operandos de 8 y 16


bits; una capacidad de direccionamiento de 20 bits (hasta 1 Mb) y comparten el mismo
juego de instrucciones.

La filosof�a de dise�o de la familia del 8086 se basa en la compatibilidad y la


creaci�n de sistemas inform�ticos integrados, por lo que disponen de diversos
coprocesadores como el 8089 de E/S y el 8087, coprocesador matem�tico de coma
flotante. De acuerdo a esta filosof�a y para permitir la compatibilidad con los
anteriores sistemas de 8 bits, el 8088 se dise�� con un bus de datos de 8 bits, lo cual
le hace m�s lento que su hermano el 8086, pues �ste es capaz de cargar una palabra
ubicada en una direcci�n par en un solo ciclo de memoria mientras el 8088 debe
realizar dos ciclos leyendo cada vez un byte.
Disponen de 92 tipos de instrucciones, que pueden ejecutar con hasta 7 modos de
direccionamiento. Tienen una capacidad de direccionamiento en puertos de entrada y
salida de hasta 64K (65536 puertos), por lo que las m�quinas construidas entorno a
estos microprocesadores no suelen emplear la entrada/salida por mapa de memoria,
como veremos.

Entre esas instrucciones, las m�s r�pidas se ejecutan en 2 ciclos te�ricos de reloj
y unos 9 reales (se trata del movimiento de datos entre registros internos) y las m�s
lentas en 206 (divisi�n entera con signo del acumulador por una palabra extra�da de
la memoria). Las frecuencias internas de reloj t�picas son 4.77 MHz en la versi�n
8086; 8 MHz en la versi�n 8086-2 y 10 MHz en la 8086-1. Recu�rdese que un MHz
son un mill�n de ciclos de reloj, por lo que un PC est�ndar a 4,77 MHz puede
ejecutar de 20.000 a unos 0,5 millones de instrucciones por segundo, seg�n la
complejidad de las mismas (un 486 a 50 MHz, incluso sin memoria cach� externa es
capaz de ejecutar entre 1,8 y 30 millones de estas instrucciones por segundo).

El microprocesador Intel 80286 se caracteriza por poseer dos modos de


funcionamiento completamente diferenciados: el modo real en el que se encuentra nada
m�s ser conectado a la corriente y el modo protegido en el que adquiere capacidad de
proceso multitarea y almacenamiento en memoria virtual. El proceso multitarea consiste
en realizar varios procesos de manera aparentemente simult�nea, con la ayuda del
sistema operativo para conmutar autom�ticamente de uno a otro optimizando el uso de
la CPU, ya que mientras un proceso est� esperando a que un perif�rico complete una
operaci�n, se puede atender otro proceso diferente. La memoria virtual permite al
ordenador usar m�s memoria de la que realmente tiene, almacenando parte de ella en
disco: de esta manera, los programas creen tener a su disposici�n m�s memoria de la
que realmente existe; cuando acceden a una parte de la memoria l�gica que no existe
f�sicamente, se produce una interrupci�n y el sistema operativo se encarga de
acceder al disco y traerla.

Cuando la CPU est� en modo protegido, los programas de usuario tienen un acceso
limitado al juego de instrucciones; s�lo el proceso supervisor -normalmente el sistema
operativo- est� capacitado para realizar ciertas tareas. Esto es as� para evitar que los
programas de usuario puedan campar a sus anchas y entrar en conflictos unos con otros,
en materia de recursos como memoria o perif�ricos. Adem�s, de esta manera, aunque
un error software provoque el cuelgue de un proceso, los dem�s pueden seguir
funcionando normalmente, y el sistema operativo podr�a abortar el proceso colgado.
Por desgracia, con el DOS el 286 no est� en modo protegido y el cuelgue de un solo
proceso -bien el programa principal o una rutina operada por interrupciones- significa la
ca�da inmediata de todo el sistema.

El 8086 no posee ning�n mecanismo para apoyar la multitarea ni la memoria virtual


desde el procesador, por lo que es dif�cil dise�ar un sistema multitarea para el mismo
y casi imposible conseguir que sea realmente operativo. Obviamente, el 286 en modo
protegido pierde absolutamente toda la compatibilidad con los procesadores anteriores.
Por ello, en este libro s�lo trataremos el modo real, �nico disponible bajo DOS,
aunque veremos alguna instrucci�n extra que tambi�n se puede emplear en modo
real.

Las caracter�sticas generales del 286 son: tiene un bus de datos de 16 bits, un bus
de direcciones de 24 bits (16 Mb); posee 25 instrucciones m�s que el 8086 y admite 8
modos de direccionamiento. En modo virtual permite direccionar hasta 1 Gigabyte. Las
frecuencias de trabajo t�picas son de 12 y 16 MHz, aunque existen versiones a 20 y 25
MHz. Aqu�, la instrucci�n m�s lenta es la misma que en el caso del 8086, solo que
emplea 29 ciclos de reloj en lugar de 206. Un 286 de categor�a media (16 MHz)
podr�a ejecutar m�s de medio mill�n de instrucciones de estas en un segundo, casi
15 veces m�s que un 8086 medio a 8 MHz. Sin embargo, transfiriendo datos entre
registros la diferencia de un procesador a otro se reduce notablemente, aunque el 286 es
m�s r�pido y no s�lo gracias a los MHz adicionales.

Versiones mejoradas de los Intel 8086 y 8088 se encuentran tambi�n en los


procesadores NEC-V30 y NEC-V20 respectivamente. Ambos son compatibles
Hardware y Software, con la ventaja de que el procesado de instrucciones est�
optimizado, llegando a superar casi en tres veces la velocidad de los originales en
algunas instrucciones aritm�ticas. Tambi�n poseen una cola de preb�squeda mayor
(cuando el microprocesador est� ejecutando una instrucci�n, si no hace uso de los
buses externos, carga en una cola FIFO de unos pocos bytes las posiciones posteriores a
la que est� procesando, de esta forma una vez que concluye la instrucci�n en curso ya
tiene internamente la que le sigue). Adem�s, los NEC V20 y V30 disponen de las
mismas instrucciones adicionales del 286 en modo real, al igual que el 80186 y el
80188.

Por su parte, el 386 dispone de una arquitectura de registros de 32 bits, con un bus de
direcciones tambi�n de 32 bits (direcciona hasta 4 Gigabytes = 4096 Mb) y m�s
modos posibles de funcionamiento: el modo real (compatible 8086), el modo protegido
(relativamente compatible con el del 286), un modo protegido propio que permite
-�por fin!- romper la barrera de los tradicionales segmentos y el modo «virtual 86», en
el que puede emular el funcionamiento simult�neo de varios 8086. Una vez m�s,
todos los modos son incompatibles entre s� y requieren de un sistema operativo
espec�fico: si se puede perdonar al fabricante la p�rdida de compatibilidad del modo
avanzados del 286 frente al 8086, debido a la l�gica evoluci�n tecnol�gica, no se
puede decir lo mismo del 386 respecto al 286: no hubiera sido necesario a�adir un
nuevo modo protegido si hubiera sido mejor construido el del 286 apenas un par de
a�os atr�s. Normalmente, los 386 suelen operar en modo real (debido al DOS) por lo
que no se aprovechan las posibilidades multitarea ni de gesti�n de memoria. Por otra
parte, aunque se pueden emplear los registros de 32 bits en modo real, ello no suele
hacerse -para mantener la compatibilidad con procesadores anteriores- con lo que de
entrada se est� tirando a la basura un 50% de la capacidad de proceso del chip, aunque
por fortuna estos procesadores suelen trabajar a frecuencias de 16/20 MHz (obsoletas) y
normalmente de 33 y hasta 40 MHz.

El 386sx es una variante del 386 a nivel de hardware, aunque es compatible en


software. B�sicamente, es un 386 con un bus de datos de s�lo 16 bits -m�s lento, al
tener que dar dos pasadas para un dato de 32 bits-. De hecho, podr�a haber sido
dise�ado perfectamente para mantener una compatibilidad hardware con el 286,
aunque el fabricante lo evit� probablemente por razones comerciales.

El 486 se diferencia del 386 en la integraci�n en un solo chip del coprocesador 387.
Tambi�n se ha mejorado la velocidad de operaci�n: la versi�n de 25 MHz dobla en
t�rminos reales a un 386 a 25 MHz equipado con el mismo tama�o de memoria
cach�. La versi�n 486sx no se diferencia en el tama�o del bus, tambi�n de 32 bits,
sino en la ausencia del 387 (que puede ser a�adido externamente). Tambi�n existen
versiones de 486 con buses de 16 bits, el primer fabricante de estos chips, denominados
486SLC, ha sido Cyrix. Una tendencia iniciada por el 486 fue la de duplicar la
velocidad del reloj interno (pongamos por caso de 33 a 66 MHz) aunque en las
comunicaciones con los buses exteriores se respeten los 33 MHz. Ello agiliza la
ejecuci�n de las instrucciones m�s largas: bajo DOS, el rendimiento general del
sistema se puede considerar pr�cticamente el doble. Son los chips DX2 (tambi�n hay
una variante a 50 MHz: 25 x 2). La culminaci�n de esta tecnolog�a viene de la mano
de los DX4 a 75/100 MHz (25/33 x 3).

El Pentium, �ltimo procesador de Intel en el momento de escribirse estas l�neas,


se diferencia respecto al 486 en el bus de datos (ahora de 64 bits, lo que agiliza los
accesos a memoria) y en un elevad�simo nivel de optimizaci�n y segmentaci�n que
le permite, empleando compiladores optimizados, simultanear en muchos casos la
ejecuci�n de dos instrucciones consecutivas. Posee dos cach�s internas, tiene
capacidad para predecir el destino de los saltos y la unidad de coma flotante
experimenta elevadas mejoras. Sin embargo, bajo DOS, un Pentium b�sico s�lo es
unas 2 veces m�s r�pido que un 486 a la misma frecuencia de reloj. Comenz� en
60/90 MHz hasta los 166/200/233 MHz de las �ltimas versiones (Pentium Pro y
MMX), que junto a diversos clones de otros fabricantes, mejoran a�n m�s el
rendimiento. Todos los equipos Pentium emplean las t�cnicas DX, ya que las placas
base t�picas corren a 60 MHz. Para hacerse una idea, por unas 200000 pts de 1997 un
equipo Pentium MMX a 233 MHz es cerca de 2000 veces m�s r�pido en aritm�tica
entera que el IBM PC original de inicios de la d�cada de los 80; en coma flotante la
diferencia aumenta incluso algunos �rdenes m�s de magnitud. Y a una fracci�n del
coste (un mill�n de pts de aquel entonces que equivale a unos 2,5 millones de hoy en
d�a). Aunque no hay que olvidar la revoluci�n del resto de los componentes: 100
veces m�s memoria (central y de v�deo), 200 veces m�s grande el disco duro... y
que un disco duro moderno transfiere datos 10 veces m�s deprisa que la memoria de
aquel IBM PC original. Por desgracia, el software no ha mejorado el rendimiento, ni
remotamente, en esa proporci�n: es la factura pasada por las t�cnicas de
programaci�n cada vez a un nivel m�s alto (aunque nadie discute sus ventajas).

Una caracter�stica de los microprocesadores a partir del 386 es la disponibilidad de


memorias cach� de alta velocidad de acceso -muy pocos nanosegundos- que
almacenan una peque�a porci�n de la memoria principal. Cuando la CPU accede a
una posici�n de memoria, cierta circuiter�a de control se encarga de ir depositando el
contenido de esa posici�n y el de las posiciones inmediatamente consecutivas en la
memoria cach�. Cuando sea necesario acceder a la instrucci�n siguiente del
programa, �sta ya se encuentra en la cach� y el acceso es muy r�pido. Lo ideal
ser�a que toda la memoria del equipo fuera cach�, pero esto no es todav�a posible
actualmente. Una cach� de tama�o razonable puede doblar la velocidad efectiva de
proceso de la CPU. El 8088 carec�a de memoria cach�, pero s� estaba equipado con
una unidad de lectura adelantada de instrucciones con una cola de preb�squeda de 4
bytes: de esta manera, se agilizaba ya un tanto la velocidad de proceso al poder ejecutar
una instrucci�n al mismo tiempo que iba leyendo la siguiente.

3.2. - REGISTROS DEL 8086 Y DEL 286.


Estos procesadores disponen de 14 registros de 16 bits (el 286 alguno m�s, pero no
se suele emplear bajo DOS). La misi�n de estos registros es almacenar las posiciones
de memoria que van a experimentar repetidas manipulaciones, ya que los accesos a
memoria son mucho m�s lentos que los accesos a los registros. Adem�s, hay ciertas
operaciones que s�lo se pueden realizar sobre los registros. No todos los registros
sirven para almacenar datos, algunos est�n especializados en apuntar a las direcciones
de memoria. La mec�nica b�sica de funcionamiento de un programa consiste en
cargar los registros con datos de la memoria o de un puerto de E/S, procesar los datos y
devolver el resultado a la memoria o a otro puerto de E/S. Obviamente, si un dato s�lo
va a experimentar un cambio, es preferible realizar la operaci�n directamente sobre la
memoria, si ello es posible. A continuaci�n se describen los registros del 8086.

AX SP CS IP
BX BP DS flags
CX SI SS
DX DI ES
Registros
Registros Registro puntero
Registros punteros de
de de instrucciones
de datos pila e
segmento y flags
�ndices

- Registros de datos:

AX, BX, CX, DX: pueden utilizarse bien como registros de 16 bits o como dos
registros separados de 8 bits (byte superior e inferior) cambiando la X por H o L seg�n
queramos referirnos a la parte alta o baja respectivamente. Por ejemplo, AX se
descompone en AH (parte alta) y AL (parte baja). Evidentemente, �cualquier cambio
sobre AH o AL altera AX!: valga como ejemplo que al incrementar AH se le est�n
a�adiendo 256 unidades a AX.

AX = Acumulador.

Es el registro principal, es utilizado en las instrucciones de multiplicaci�n y


divisi�n y en algunas instrucciones aritm�ticas especializadas, as� como en ciertas
operaciones de car�cter espec�fico como entrada, salida y traducci�n. Obs�rvese
que el 8086 es suficientemente potente para realizar las operaciones l�gicas, la suma y
la resta sobre cualquier registro de datos, no necesariamente el acumulador.

BX = Base.
Se usa como registro base para referenciar direcciones de memoria con
direccionamiento indirecto, manteniendo la direcci�n de la base o comienzo de tablas
o matrices. De esta manera, no es preciso indicar una posici�n de memoria fija, sino la
n�mero BX (as�, haciendo avanzar de unidad en unidad a BX, por ejemplo, se puede
ir accediendo a un gran bloque de memoria en un bucle).

CX = Contador.
Se utiliza com�nmente como contador en bucles y operaciones repetitivas de
manejo de cadenas. En las instrucciones de desplazamiento y rotaci�n se utiliza como
contador de 8 bits.

DX = Datos.
Usado en conjunci�n con AX en las operaciones de multiplicaci�n y divisi�n
que involucran o generan datos de 32 bits. En las de entrada y salida se emplea para
especificar la direcci�n del puerto E/S.

- 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.

CS = Registro de segmento de c�digo (code segment).


Contiene la direcci�n del segmento con las instrucciones del programa. Los
programas de m�s de 64 Kb requieren cambiar CS peri�dicamente.

DS = Registro de segmento de datos (data segment).


Segmento del �rea de datos del programa.

SS = Registro de segmento de pila (stack segment).


Segmento de pila.

ES = Registro de segmento extra (extra segment).


Segmento de ampliaci�n para zona de datos. Es extraordinariamente �til
actuando en conjunci�n con DS: con ambos se puede definir dos zonas de 64 Kb, tan
alejadas como se desee en el espacio de direcciones, entre las que se pueden
intercambiar datos.

- Registros punteros de pila:

SP = Puntero de pila (stack pointer).


Apunta a la cabeza de la pila. Utilizado en las instrucciones de manejo de la pila.

BP = Puntero base (base pointer).


Es un puntero de base, que apunta a una zona dentro de la pila dedicada al
almacenamiento de datos (variables locales y par�metros de las funciones en los
programas compilados).

- Registros �ndices:

SI = �ndice fuente (source index).


Utilizado como registro de �ndice en ciertos modos de direccionamiento
indirecto, tambi�n se emplea para guardar un valor de desplazamiento en operaciones
de cadenas.
DI = �ndice destino (destination index).
Se usa en determinados modos de direccionamiento indirecto y para almacenar un
desplazamiento en operaciones con cadenas.

- Puntero de instrucciones o contador de programa:

IP = Puntero de instrucci�n (instruction pointer).


Marca el desplazamiento de la instrucci�n en curso dentro del segmento de
c�digo. Es autom�ticamente modificado con la lectura de una instrucci�n.

- Registro de estado o de indicadores (flags).

Es un registro de 16 bits de los cuales 9 son utilizados para indicar diversas


situaciones durante la ejecuci�n de un programa. Los bits 0, 2, 4, 6, 7 y 11 son
indicadores de condici�n, que reflejan los resultados de operaciones del programa; los
bits del 8 al 10 son indicadores de control y el resto no se utilizan. Estos indicadores
pueden ser comprobados por las instrucciones de salto condicional, lo que permite
variar el flujo secuencial del programa seg�n el resultado de las operaciones.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF

• CF (Carry Flag): Indicador de acarreo. Su valor m�s habitual es lo que nos


llevamos en una suma o resta.
• OF (Overflow Flag): Indicador de desbordamiento. Indica que el resultado de
una operaci�n no cabe en el tama�o del operando destino.
• ZF (Zero Flag): Indicador de resultado 0 o comparaci�n igual.
• SF (Sign Flag): Indicador de resultado o comparaci�n negativa.
• PF (Parity Flag): Indicador de paridad. Se activa tras algunas operaciones
aritm�tico-l�gicas para indicar que el n�mero de bits a uno resultante es par.
• AF (Auxiliary Flag): Para ajuste en operaciones BCD.
• DF (Direction Flag): Indicador de direcci�n. Manipulando bloques de
memoria, indica el sentido de avance (ascendente/descendente).
• IF (Interrupt Flag): Indicador de interrupciones: puesto a 1 est�n permitidas.
• TF (Trap Flag): Indicador de atrape (ejecuci�n paso a paso).

3.3. - REGISTROS DEL 386 Y PROCESADORES SUPERIORES.

Los 386 y superiores disponen de muchos m�s registros de los que vamos a ver
ahora. Sin embargo, bajo el sistema operativo DOS s�lo se suelen emplear los que
veremos, que constituyen b�sicamente una extensi�n a 32 bits de los registros
originales del 8086.
Se ampl�a el tama�o de los registros de datos (que pueden ser accedidos en
fragmentos de 8, 16 � 32 bits) y se a�aden dos nuevos registros de segmento
multiprop�sito (FS y GS). Algunos de los registros aqu� mostrados son realmente de
32 bits (como EIP en vez de IP), pero bajo sistema operativo DOS no pueden ser
empleados de manera directa, por lo que no les consideraremos.

3.4. - MODOS DE DIRECCIONAMIENTO.

Son los distintos modos de acceder a los datos en memoria por parte del procesador.
Antes de ver los modos de direccionamiento, echaremos un vistazo a la sintaxis general
de las instrucciones, ya que pondremos alguna en los ejemplos:

INSTRUCCI�N DESTINO, FUENTE

Donde destino indica d�nde se deja el resultado de la operaci�n en la que pueden


participar (seg�n casos) FUENTE e incluso el propio DESTINO. Hay instrucciones,
sin embargo, que s�lo tienen un operando, como la siguiente, e incluso ninguno:

INSTRUCCI�N DESTINO

Como ejemplos, aunque no hemos visto a�n las instrucciones utilizaremos un par
de ellas: la de copia o movimiento de datos (MOV) y la de suma (ADD).

3.4.1. - ORGANIZACI�N DE DIRECCIONES: SEGMENTACI�N.

Como ya sabemos, los microprocesadores 8086 y compatibles poseen registros de un


tama�o m�ximo de 16 bits que direccionar�an hasta 64K; en cambio, la direcci�n
se compone de 20 bits con capacidad para 1Mb, hay por tanto que recurrir a alg�n
artificio para direccionar toda la memoria. Dicho artificio consiste en la segmentaci�n:
se trata de dividir la memoria en grupos de 64K. Cada grupo se asocia con un registro
de segmento; el desplazamiento (offset) dentro de ese segmento lo proporciona otro
registro de 16 bits. La direcci�n absoluta se calcula multiplicando por 16 el valor del
registro de segmento y sumando el offset, obteni�ndose una direcci�n efectiva de 20
bits. Esto equivale a concebir el mecanismo de generaci�n de la direcci�n absoluta,
como si se tratase de que los registros de segmento tuvieran 4 bits a 0 (imaginarios) a la
derecha antes de sumarles el desplazamiento:
direcci�n = segmento * 16 + offset

En la pr�ctica, una direcci�n se indica con la notaci�n SEGMENTO:OFFSET;


adem�s, una misma direcci�n puede expresarse de m�s de una manera: por ejemplo,
3D00h:0300h es equivalente a 3D30:0000h. Es importante resaltar que no se puede
acceder a m�s de 64 Kb en un segmento de datos. Por ello, en los procesadores 386 y
superiores no se deben emplear registros de 32 bit para generar direcciones (bajo DOS),
aunque para los c�lculos pueden ser interesantes (no obstante, s� ser�a posible
configurar estos procesadores para poder direccionar m�s memoria bajo DOS con los
registros de 32 bits, aunque no resulta por lo general pr�ctico).

3.4.2. - MODOS DE DIRECCIONAMIENTO.

- Direccionamiento inmediato: El operando es una constante situada detr�s del


c�digo de la instrucci�n. Sin embargo, como registro destino no se puede indicar uno
de segmento (habr� que utilizar uno de datos como paso intermedio).

ADD AX,0fffh

El n�mero hexadecimal 0fffh es la constante num�rica que en el


direccionamiento inmediato se le sumar� al registro AX. Al trabajar con
ensambladores, se pueden definir s�mbolos constantes (ojo, no variables) y es m�s
intuitivo:

dato EQU 0fffh ; s�mbolo constante


MOV AX,dato

Si se referencia a la direcci�n de memoria de una variable de la siguiente forma,


tambi�n se trata de un caso de direccionamiento inmediato:

dato DW 0fffh ; ahora es una variable


MO AX,OFFSET dato ; AX = "direcci�n de memoria"
de dato

Porque hay que tener en cuenta que cuando traduzcamos a n�meros el s�mbolo
podr�a quedar:

17F3:0A11 DW FFF
MOV AX,0A11

- Direccionamiento de registro: Los operandos, necesariamente de igual tama�o,


est�n contenidos en los registros indicados en la instrucci�n:

MOV DX,AX
MOV AH,AL

- Direccionamiento directo o absoluto: El operando est� situado en la direcci�n


indicada en la instrucci�n, relativa al segmento que se trate:

MOV AX,[57D1h]
MOV AX,ES:[429Ch]
Esta sintaxis (quitando la 'h' de hexadecimal) ser�a la que admite el programa
DEBUG (realmente habr�a que poner, en el segundo caso, ES: en una l�nea y el
MOV en otra). Al trabajar con ensambladores, las variables en memoria se pueden
referenciar con etiquetas simb�licas:

MOV AX,dato
MOV AX,ES:dato

dato DW 1234h ; variable del programa

En el primer ejemplo se transfiere a AX el valor contenido en la direcci�n


apuntada por la etiqueta dato sobre el segmento de datos (DS) que se asume por
defecto; en el segundo ejemplo se indica de forma expl�cita el segmento trat�ndose
del segmento ES. La direcci�n efectiva se calcula de la forma ya vista con
anterioridad: Registro de segmento * 16 + desplazamiento_de_dato (este
desplazamiento depende de la posici�n al ensamblar el programa).

- Direccionamiento indirecto: El operando se encuentra en una direcci�n se�alada


por un registro de segmento*16 m�s un registro base (BX/BP) o �ndice (SI/DI).
(Nota: BP act�a por defecto con SS).

MOV AX,[BP] ; AX = [SS*16+BP]


MOV ES:[DI],AX ; [ES*16+DI] = AX

- Indirecto con �ndice o indexado: El operando se encuentra en una direcci�n


determinada por la suma de un registro de segmento*16, un registro de �ndice, SI o DI
y un desplazamiento de 8 � 16 bits. Ejemplos:

MOV AX,[DI+DESP] � MOV AX,desp[DI]


ADD [SI+DESP],BX � ADD desp[SI],BX

- Indirecto con base e �ndice o indexado a base: El operando se encuentra en una


direcci�n especificada por la suma de un registro de segmento*16, uno de base, uno de
�ndice y opcionalmente un desplazamiento de 8 � 16 bits:

MOV AX,ES:[BX+DI+DESP] � MOV AX,ES:desp[BX][DI]


MOV CS:[BX+SI+DESP],CX � MOV CS:desp[BX][SI],CX

Combinaciones de registros de segmento y desplazamiento.

Como se ve en los modos de direccionamiento, hay casos en los que se indica


expl�citamente el registro de segmento a usar para acceder a los datos. Existen unos
segmentos asociados por defecto a los registros de desplazamiento (IP, SP, BP, BX, DI,
SI); s�lo es necesario declarar el segmento cuando no coincide con el asignado por
defecto. En ese caso, el ensamblador genera un byte adicional (a modo de prefijo) para
indicar cu�l es el segmento referenciado. La siguiente tabla relaciona las posibles
combinaciones de los registros de segmento y los de desplazamiento:

CS SS DS ES
IP S� No No No
SP No S� No No
BP con prefijo por defecto con prefijo con prefijo
BX con prefijo con prefijo por defecto con prefijo
SI con prefijo con prefijo por defecto con prefijo
DI con prefijo con prefijo por defecto con prefijo(1)
(1) Tambi�n por defecto en el manejo de cadenas.

Los 386 y superiores admiten otros modos de direccionamiento m�s sofisticados,


que se ver�n en el pr�ximo cap�tulo, despu�s de conocer todas las instrucciones
del 8086. Por ahora, con todos estos modos se puede considerar que hay m�s que
suficiente. De hecho, algunos se utilizan en muy contadas ocasiones.

3.5. - LA PILA.

La pila es un bloque de memoria de estructura LIFO (Last Input First Output:


�ltimo en entrar, primero en salir) que se direcciona mediante desplazamientos desde
el registro SS (segmento de pila). Las posiciones individuales dentro de la pila se
calculan sumando al contenido del segmento de pila SS un desplazamiento contenido en
el registro puntero de pila SP. Todos los datos que se almacenan en la pila son de
longitud palabra, y cada vez que se introduce algo en ella por medio de las instrucciones
de manejo de pila (PUSH y POP), el puntero se decrementa en dos; es decir, la pila
avanza hacia direcciones decrecientes. El registro BP suele utilizarse normalmente para
apuntar a una cierta posici�n de la pila y acceder indexadamente a sus elementos
-generalmente en el caso de variables- sin necesidad de desapilarlos para consultarlos.

La pila es utilizada frecuentemente al principio de una subrutina para preservar los


registros que no se desean modificar; al final de la subrutina basta con recuperarlos en
orden inverso al que fueron depositados. En estas operaciones conviene tener cuidado,
ya que la pila en los 8086 es com�n al procesador y al usuario, por lo que se
almacenan en ella tambi�n las direcciones de retorno de las subrutinas. Esta �ltima
es, de hecho, la m�s importante de sus funciones. La estructura de pila permite que
unas subrutinas llamen a otras que a su vez pueden llamar a otras y as� sucesivamente:
en la pila se almacenan las direcciones de retorno, que ser�n las de la siguiente
instrucci�n que provoc� la llamada a la subrutina. As�, al retornar de la subrutina se
extrae de la pila la direcci�n a donde volver. Los compiladores de los lenguajes de alto
nivel la emplean tambi�n para pasar los par�metros de los procedimientos y para
generar en ella las variables autom�ticas -variables locales que existen durante la
ejecuci�n del subprograma y se destruyen inmediatamente despu�s-. Por ello, una
norma b�sica es que se debe desapilar siempre todo lo apilado para evitar una p�rdida
de control inmediata del ordenador.

Ejemplo de operaci�n sobre la pila (todos los datos son arbitrarios):


3.6. - UN PROGRAMA DE EJEMPLO.

Aunque las instrucciones del procesador no ser�n vistas hasta el pr�ximo


cap�tulo, con objeto de ayudar a la imaginaci�n del lector elaboraremos un primer
programa de ejemplo en lenguaje ensamblador. La utilidad de este programa es dejar
patente que lo �nico que entiende el 8086 son n�meros, aunque nosotros nos
referiremos a ellos con unos s�mbolos que faciliten entenderlos. Tambi�n es
interesante este ejemplo para afianzar el concepto de registro de segmento.

En este programa s�lo vamos a emplear las instrucciones MOV, ya conocida, y


alguna otra m�s como la instrucci�n INC (incrementar), DEC (disminuir una unidad)
y JNZ (saltar si el resultado no es cero). Suponemos que el programa est� ubicado a
partir de la direcci�n de memoria 14D3:7A10 (arbitrariamente elegida) y que lo que
pretendemos hacer con �l es limpiar la pantalla. Como el ordenador es un PC con
monitor en color, la pantalla de texto comienza en B800:0000 (no es m�s que una zona
de memoria). Por cada car�cter que hay en dicha pantalla, comenzando arriba a la
izquierda, a partir de la direcci�n B800:0000 tenemos dos bytes: el primero, con el
c�digo ASCII del car�cter y el segundo con el color. Lo que vamos a hacer es
rellenar los 2000 caracteres (80 columnas x 25 l�neas) con espacios en blanco
(c�digo ASCII 32, � 20h en hexadecimal), sin modificar el color que hubiera antes.
Esto es, se trata de poner el valor 32 en la direcci�n B800:0000, la B800:0002, la
B800:0004... y as� sucesivamente.

El programa quedar�a en memoria de esta manera: La primera columna indica la


direcci�n de memoria donde est� el programa que se ejecuta (CS=14D3h e
IP=7A10h al principio). La segunda columna constituye el c�digo m�quina que
interpreta el 8086. Algunas instrucciones ocupan un byte de memoria, otras dos � tres
(las hay de m�s). La tercera columna contiene el nombre de las instrucciones, algo
mucho m�s legible para los humanos que los n�meros:

14D3:7A10 B9 D0 07 MOV CX,7D0H ; CX = 7D0h (2000


decimal = 7D0 hexadecimal)
14D3:7A13 B8 00 B8 MOV AX,0B800h ; segmento de la
memoria de pantalla
14D3:7A16 8E D8 MOV DS,AX ; apuntar segmento de
datos a la misma
14D3:7A18 BB 00 00 MOV BX,0 ; apuntar al primer
car�cter ASCII de la pantalla
14D3:7A1B C6 07 20 MOV BYTE PTR [BX],32 ; se pone BYTE PTR para
indicar que 32 es de 8 bits
14D3:7A1E 43 INC BX ; BX=BX+1 -< apuntar al
byte de color
14D3:7A1F 43 INC BX ; BX=BX+1 -< apuntar al
siguiente car�cter ASCII
14D3:7A20 49 DEC CX ; CX=CX-1 -< queda un
car�cter menos
14D3:7A21 75 F8 JNZ -8 ; si CX no es 0, saltar
8 bytes atr�s (a 14D3:7A1B)

Como se puede ver, la segunda instrucci�n (bytes de c�digo m�quina 0B8h, 0 y 0B8h colocados
en posiciones consecutivas) est� colocada a partir del desplazamiento 7A13h, ya que la anterior que
ocupaba 3 bytes comenzaba en 7A10h. En el ejemplo cargamos el valor 0B800h en DS apoy�ndonos en
AX como intermediario. El motivo es que los registros de segmento no admiten el direccionamiento
inmediato. A medida que se van haciendo programas, el ensamblador da mensajes de error cuando se
encuentra con estos fallos y permite ir aprendiendo con facilidad las normas, que tampoco son
demasiadas. La instrucci�n MOV BYTE PTR [BX],32 equivale a decir: «poner en la direcci�n de
memoria apuntada por BX (DS:[BX] para ser m�s exactos) el byte de valor 32». El valor 0F8h del
c�digo m�quina de la �ltima instrucci�n es el complemento a dos (n�mero negativo) del valor 8.

Normalmente, casi nunca habr� que ensamblar

Microprocesadores
• Introducción
• Procesador
• La unidad de procesamiento central
• Unidad central de procesamiento (CPU)
• Avance tecnológico de los procesadores
• 8088/8086
• 80286
• 80386 DX y SX
• 80486DX/80486SX
• 80486DX2, 80486DX4, 80486SX2
• Overdrives
• La familia Pentium
• Pentium Overdrive
• Pentium Pro
• Ejecución dinámica
• El futuro próximo de Intel
• Anexos

INTRODUCCION
El microprocesador es uno de los logros más sobresalientes del siglo XX. Esas
son palabras atrevidas, y hace un cuarto de siglo tal afirmación habría parecido
absurda. Pero cada año, el microprocesador se acerca más al centro de nuestras
vidas, forjándose un sitio en el núcleo de una máquina tras otra. Su presencia ha
comenzado a cambiar la forma en que percibimos el mundo e incluso a nosotros
mismos. Cada vez se hace más difícil pasar por alto el microprocesador como
otro simple producto en una larga línea de innovaciones tecnológicas.
Ninguna otra invención en la historia se ha diseminado tan aprisa por todo el
mundo o ha tocado tan profundamente tantos aspectos de la existencia humana.
Hoy existen casi 15,000 millones de microchips de alguna clase en uso (el
equivalente de dos computadoras poderosas para cada hombre, mujer y niño del
planeta). De cara a esa realidad, ¿quién puede dudar que el microprocesador no
sólo está transformando los productos que usamos, sino también nuestra forma
de vivir y, por último, la forma en que percibimos la realidad?
No obstante que reconocemos la penetración del microprocesador en nuestras
vidas, ya estamos creciendo indiferentes a la presencia de esos miles de
máquinas diminutas que nos encontramos sin saberlo todos los días. Así que,
antes de que se integre de manera demasiado imperceptible en nuestra diaria
existencia, es el momento de celebrar al microprocesador y la revolución que ha
originado, para apreciar el milagro que es en realidad cada uno de esos chips de
silicio diminutos y meditar acerca de su significado para nuestras vidas y las de
nuestros descendientes.
Procesador
La unidad de procesamiento central
La unidad de procesamiento central (CPU) es donde se manipulan los datos. En
una microcomputadora, el CPU completo está contenido en un chip muy
pequeño llamado microprocesador. Todas las CPU tienen por lo menos dos
partes básicas, la unidad de control y la unidad aritméticológica. Todos los
recursos de la computadora son administrados desde la unidad de control,
cuya función es coordinar todas las actividades de la computadora. La unidad de
control contiene las instrucciones de la CPU para llevar a cabo comandos. El
conjunto de instrucciones, que está incluido dentro de los circuitos de la
unidad de control, es una lista de todas las operaciones que realiza la CPU. Cada
instrucción en el conjunto de instrucciones es acompañado por un
microcódigo, que son instrucciones muy básicas que le dicen a la CPU cómo
ejecutar las instrucciones. Cuando la computadora corre un programa, busca los
comandos del programa dentro del conjunto de instrucciones de la CPU y las
ejecuta en orden. La unidad aritmético-lógico (ALU)es cuando la unidad de
control encuentra una instrucción que involucra aritmética o lógica, le pasa el
control al segundo componente de la CPU. La ALU incluye un grupo de
registros, es decir, memoria construida directamente en la CPU que se usa para
guardar datos que están siendo procesados por la instrucción actual.

Unidad Central de Procesamiento (CPU)


La CPU de una computadora contiene la inteligencia de la máquina; es donde se
realizan los cálculos y las decisiones. El complejo procedimiento que transforma
datos nuevos de entrada en información útil de salida se llama
procesamiento. Para llevar a cabo esta transformación, la computadora usa
dos componentes: el procesador y la memoria. El procesador es el cerebro de
la computadora, la parte que interpreta y ejecuta las instrucciones. El
procesador casi siempre se compone de varios circuitos integrados o chips,
estos están insertados en tarjetas de circuitos, módulos rígidos rectangulares
con circuitos que los unen a otros chips y a otras tarjetas de circuitos.
El microprocesador moderno contiene unos 20 millones de transistores y cada
chip terminado es el producto de procesos más complicados que los que se
utilizaron en el Proyecto Manhattan para construir la bomba atómica. Y no
obstante, pese a un proceso de manufactura extraordinariamente refinado, los
microchips se producen en volumen a razón de más de 1,000 millones de
unidades por año. Para poner esta complejidad en perspectiva, imagínese que
dentro de cada microprocesador diminuto existe una estructura tan compleja
como una ciudad de tamaño mediano, incluidas todas sus líneas de energía
eléctrica, líneas telefónicas, líneas de drenaje, edificios, calles y casas. Ahora
imagine que en esa misma ciudad, millones de personas se desplazan a la
velocidad de la luz y con la sincronización perfecta en una danza de coreografía
muy complicada.
Y eso es tan sólo un chip. De todas las estadísticas asombrosas que se utilizan
para describir el mundo del microprocesador, ninguna es más extraordinaria
que ésta: el número total de transistores que integran todos los microchips que
se producirán en el mundo este año es equivalente al número de gotas de lluvia
que caerán en California durante ese mismo periodo.
Avance Tecnológico de los procesadores.
8088 / 8086
En 1975 Intel decidió ponerse manos a la obra para construir su primer micro
de 16 bits que salió al mercado en 1978. Se trataba del 8086, que definió el
inicio de su gama de productos más famosa, la familia de microprocesadores
x86.
La longitud de los registros del 8086 era de 16 bits (de ahí su denominación de
16 bits), había versiones que funcionaban a 4.77 y 8 MHz, tenía un bus de datos
de 16 bits y un bus de direcciones de 20 bits, lo que le permitía acceder a un
máximo de memoria de 1 Mb según el cálculo 2 elevado a 20. Seguidamente, en
1979, Intel sacó el 8088, que en contra de lo que podamos pensar no es mejor
que el 8086. La diferencia era sustancial; el bus de datos era de 8 bits (la mitad).
Este paso hacia atrás estuvo provocado por el estado de la industria de la época.
Utilizar un bus de datos de 16 bits suponía forzar al mercado a desarrollar para
16 bits lo que implicaba un incremento en los costes de desarrollo de
controladores de periféricos y memorias. El síntoma fue que Intel se había
adelantado a su época.
Los japoneses, aprovechando la ocasión y dando fe a su fama de copiones
fabricaron unos clónicos de los 8086 y 8088. Fue NEC la que, por
procedimientos de ingeniería inversa, sacó el diseño de estos micros y creó sus
modelos V20 y V30, que incrementaban el rendimiento respecto a los de Intel
en un 10-30 por ciento. Como os podréis imaginar Intel demandó a NEC, pero
perdió el juicio. La Justicia determinó que el microcódigo del chip podía
registrarse pero Intel no había marcado en el chip el símbolo del copyright, con
lo cual perdía los derechos de copia.
Se encuentra un error de diseño en el 8088 que afecta a la gestión de
interrupciones y al registro de pila SS (Stack Segment).
Intel fabricó variaciones de estos modelos, sacando al mercado los 80C86,
80C88, 80186 y 80188 cuyas modificaciones fueron el ahorro de energía en las
versiones C para su instalación en portátiles, y el rediseño interno para la
optimización en las versiones 1.
80286
En 1984 aparece el 80286 como base para una nueva generación de
ordenadores de IBM, el IBM AT (Advanced Technology). Supone un nuevo
salto tecnológico. Además de incrementar el bus de direcciones de 20 bits a 24,
lo que permitía acceder hasta los 16 Mb de RAM, se incrementaba la velocidad,
llegando a ser hasta un 25 por ciento más rápidos que los 8086 y 8088
originales.
La novedad más importante que se introdujo fue la gestión de memoria virtual.
La memoria virtual es una extensión de memoria en disco (o dispositivo de
almacenamiento secundario) añadida a la memoria física instalada. Así, el
80286 es capaz de tratar hasta un total de 1 Gb, desglosado en 16 Mb de
memoria física más 1008 Mb de memoria virtual. La memoria virtual solamente
la utilizan los programas que están preparados para ello.
Aparece también un nuevo modo de operación del microprocesador. Aparte del
modo real (el normal de operación) que direcciona hasta 1 Mb de memoria física
y asegura la compatibilidad para aplicaciones diseñadas par los 8086/8088, se
tiene el modo protegido que no es compatible con estos programas
desarrollados para los micros antes mencionados. El modo protegido es el que
permite acceder a los 1.008 Mb de memoria virtual.
El 80286 trabaja en su arranque en modo real. El cambio a modo protegido, lo
que se conoce técnicamente como upshift, no es reversible (downshift), siendo
necesario hacer un reset del microprocesador para volver al modo real; sin duda
un gran fallo de diseño.
El 80286 se presentó con velocidades de reloj de 2, 8, 10, 12, 16 y 20 MHz.
80386 DX y SX
Introducido en 1985, el 80386 DX supera un nuevo escalón en el avance
tecnológico en microprocesadores. Se incorpora una nueva ampliación y surge
el número mágico, el 32. Los buses de datos y de direcciones se amplían hasta
32 líneas de datos, ocurriendo lo mismo con el tamaño de los registros. Esta
ampliación supone un incremento en la memoria RAM física instalada. Puede
direccionar 4 Gb de memoria física (DX significa Double word eXternal) y 64
Tb de memoria virtual, una cifra que en la actualidad está aún muy por encima
de las posibilidades económicas de los usuarios (a ver quién instala 4.000
Megabytes de RAM, unos 20 millones de pesetas).
Arranca en modo real, al igual que el 80286, e incorpora un nuevo modo de
operación: el modo real virtual del 8086, que permite tener varias sesiones
8086 trabajando simultáneamente simulando una especie de pseudomultitarea.
En los microprocesadores anteriores la gestión de memoria se realizaba en
segmentos de 16 Kb. Con el 80286 este tamaño de los segmentos de la memoria
se hacían muy pequeños y el programador tenía que trabajar más para
adaptarse a una gran cantidad de segmentos. El 80386 permite la definición de
segmentos de memoria de tamaño variable. Aparte, Intel corrigió la deficiencia
del downshifting, pudiéndose realizar por software.
Otra de las innovaciones en la inclusión de una memoria cache interna en el
chip destinada a almacenar instrucciones provenientes de memoria sin
necesidad de que la unidad de ejecución intervenga. Intel comete un nuevo
error en el diseño del micro que genera inexactitudes en el cálculo de 32 bits,
que se presentan en los micros lanzados al mercado hasta mayo del 1987. Los
modelos corregidos van etiquetados con una doble sigma mayúscula o con el
identificativo DX. Este error afectaba a las operaciones de multiplicación de 32
bits. Ocurría bajo las siguientes circunstancias:
• Se usa la memoria virtual y se produce una demanda de página.
• El coprocesador matemático 80387 está instalado y en uso.
• Debe ocurrir una operación de acceso directo a memoria (DMA).
• El 80386 debe estar en estado de espera (Wait State).

Se detecta un segundo bug denominado POPAD bug. Su efecto es el vaciado del


registro acumulador EAX cuando se ejecuta una instrucción de acceso a
memoria inmediatamente después de la ejecución de la instrucción POPAD.
Aparecen variaciones que afectan al consumo de energía pensadas para
portátiles, se trataba de los 80386SL (Slow Low power) y 80386SLC (Slow Low
power Cache), que es propiedad de IBM aunque lo fabrique Intel. Las
frecuencias de funcionamiento eran de 12, 20, 25 y 33 MHz.
El 80386SX (SX significa Simple word eXternal) tiene las mismas
características que el 80386DX, salvo que el bus de direcciones externo se
reduce a 16 bits. Introducido en 1988 daba la potencia de un 80386 a precio de
un 80286. Durante mucho tiempo se rumoreó que el P9 podría ser compatible
con los zócalos 80286, pero al final no fue así. La razón es que el 80286
multiplexa todos sus buses para conseguir con menos líneas el mismo resultado
(menor coste) El 80386SX sólo multiplexa el bus de direcciones. Las
frecuencias de funcionamiento eran de 16, 20, 25 y 33 MHz.
80486DX 80486SX
El 80486DX salió al mercado en 1989. La estructura interna hablando en
términos numéricos es igual a la de un 80386. El tamaño de los registros y de
los buses son de 32 bits. Mantiene los tres modos de operación: real, protegido y
real virtual. Las diferencias reales con los 80386DX son que tiene un flag más,
un estado de excepción más, 2 bits más en la tabla de entrada de páginas, 6
instrucciones y los registros de control tienen una longitud de 9 bits.
Se realizan también cambios en la arquitectura interna. Se crea un mayor
número de líneas hardware lo que implica un incremento en la velocidad. Se
imponen reglas de diseño más estrictas, lo que supone un reducción del tamaño
del chip. Al reducirse el tamaño se reduce también el consumo y
consiguientemente la temperatura que alcanza el chip, con lo cual lo podemos
hacer funcionar a un mayor número de ciclos de reloj, lo que supondrá la
aparición de los Overdrives.
Se incluye un coprocesador matemático interno que dobla las prestaciones de
un 80387 trabajando a la misma velocidad. Se logra un diseño mejor y la
comunicación entre el chip principal y el coprocesador matemático es interna, lo
que mejora la velocidad en las transferencias y unas sincronizaciones más
estrechas.
La memoria cache (8 Kb) del microprocesador está dividida en 4 caches de 2 Kb
cada una. Esto agiliza la ejecución de algunas aplicaciones. Si se asigna una
memoria cache secundaria (L2) el rendimiento del micro puede aumentar hasta
un 30 por ciento más.
El 80486SX es igual que un 80486DX, sólo que el coprocesador matemático
está inhabilitado. El coprocesador matemático 80487SX es en realidad un
80486DX puro que desactiva por completo el 80486SX, sin que podamos
retirarlo de la placa. Las velocidades a las que funcionan son de 25, 33, 40 y 50
MHz. Hay versión SL para portátiles.
80486DX2, 80486DX4, 80486SX2
Estos modelos de microprocesadores en realidad son iguales que sus hermanos
menores. Internamente duplican la velocidad del reloj del sistema. Es igual que
revolucionar el motor de un coche para que corra más. Las consecuencias son
obvias: un sobrecalentamiento del micro con una reducción de potencia. Por
este motivo se recomienda utilizar un método de disipación de calor para que el
rendimiento no se vea reducido (laminillas disipadoras o ventiladores). Las
velocidades a las que trabajan son: 50, 66, 75 y 100 (sólo para el DX4) MHz para
los DX2 y 40 y 50 MHz para los SX2.
Los 80486 tampoco están libres del pecado original. En el 80486 cuando el
coprocesador matemático detecta un error de limite del tamaño de segmento,
algunas veces la CPU falla al generar la excepción 13. Este error se genera bajo
las siguientes condiciones:
• Segmento de datos de 64 Kb.
• Operandos de direccionamiento de 16 bits.
• Almacenar un valor de 8 bytes desde el coprocesador cuando la mitad
está fuera de los limites del limite del segmento.

Un segundo bug aparece en el cálculo de la instrucción dedicada a calcular


arcotangentes.
Overdrives
Intel comenzó una nueva política con la salida de los microprocesadores con la
denominación Overdrive. Los Overdrive eran actualizaciones para los
microprocesadores instalados en los sistemas que dispusieran de un segundo
zócalo para tal propósito. En esta primera generación de Overdrives los chips
disponían de un duplicador de frecuencia interno y tenían un pin más, el
número 169. Este pin se encargaba de inhabilitar el 80486 instalado en la placa
dejando como único micro funcionando el Overdrive. No era posible la retirada
del micro anterior, puesto que el sistema dejaba de funcionar. La política de
actualización era buena, lo que no era tan bueno era la trampa para los usuarios.
Si se puede retirar el micro anterior se puede vender a usuarios que necesiten
menos potencia, no siendo tan gravosa la inversión de más de 80.000 pesetas
que costaban cuando salieron los primeros en 1991.
En la segunda generación de Overdrives se olvidó el pin 169, teniendo los 168
que los hacían compatibles con los zócalos de los 80486. En estos casos la
actualización es sencillísima: quitar el que estaba y poner el nuevo en el mismo
lugar.
La tercera generación de Overdrives trabaja con un consumo menor para
reducir de este modo su alta temperatura. El voltaje se reduce a 3.3 voltios de
los 5 que necesitaban los anteriores. Si vas a comprar un DX2 o DX4 fíjate bien
qué voltaje utiliza vuestra placa. los Overdrives etiquetados como tal funcionan
a 5V, los etiquetados directamente como DX4, sin disipador, funcionan a 3.3V.
La familia Pentium
La quinta generación de microprocesadores Intel tomó el
nombre de Pentium. Aparecido en marzo de 1993 en
frecuencias de trabajo de 60 y 66 MHz llega a ser cinco veces más potente que
un 80486 a 33 MHz. Fabricados con un proceso BiCMOS de geometría de 8
micras y con una arquitectura superescalar, los microprocesadores Pentium se
encuadran en un concepto RISC. Mientras que el 80386 y el 80486 tienen una
unidad de ejecución, el Pentium tiene dos, pudiendo ejecutar dos instrucciones
por ciclo de reloj con sus correspondientes cálculos, ya que también tiene dos
unidades aritmético-lógicas (ALU). El 80386 (CISC) ejecuta un instrucción en
varios ciclos de reloj y el 80486 ejecuta una instrucción por ciclo de reloj (en
términos medios).
Intel toma como modelo la estructura separada para la memoria cache interna
del microprocesador. Consta de dos bloques de 8 Kb, uno para las instrucciones
y otro para los datos que funcionan bajo una estructura de asociación de
conjuntos bidireccional. Para los extremadamente curiosos el algoritmo de
sustitución de datos en la cache es el LRU (Least Recently Used, el menos
utilizado recientemente).
El coprocesador matemático incluido utiliza algoritmos mejorados y añade
instrucciones de suma, multiplicación y división de números en punto flotante
integradas en el silicio, además de incorporar un pipeline de 8 niveles para
lograr ejecutar operaciones en punto flotante en un solo ciclo de reloj.
Se integran nuevos avances tecnológicos, además de los ya comentados, como
por ejemplo la predicción de ramificaciones, buses de datos internos de 256 bits,
bus de datos externo de 64 bits (que soporta transferencias de 258 Kbytes por
segundo) y memorias cache de escritura diferida.
La tecnología de bus PCI se presenta junto con el Pentium, que incorporaba una
mejor implementación del bus local. Permite tener hasta 10 conectores PCI en
un primer nivel, conectados al procesador a través de la circuitería controladora
PCI (conexión no directa).
Intel apunta ahora hacia el mercado del entorno cliente/servidor. Con el
Pentium se puede construir un ordenador multiprocesador con 16 Pentium
instalados, pudiendo actuar uno de ellos como agente supervisor del sistema
para entornos que requieran un estricto control de errores (Functional
Redundancy Checking ). Aunque esto sirvió de poco en un principio. Seguro que
recordáis el famoso bug de Pentium. La nueva y mejorada unidad de punto
flotante cometía un error garrafal al hacer una simple división. La siguiente
función escrita para Visual Basic detecta si un Pentium genera un fallo de
cálculo:
Function PentiumTest () As Double

Dim x As Double, y As Double, z As Double

x = 4195835#

y = 3145727#

z = x - (x / y) * y

PentiumTest = z
End Function

Recientemente han aparecido versiones del Pentium a 75, 90, 100 y 133
MHz, siendo el último, presentado el 23 de octubre, uno a 120 MHz
diseñado especialmente para ordenadores portátiles.
Pentium Overdrive
¡Cómo no íbamos a disponer de una versión "light" del Pentium compatible pin
a pin con nuestros microprocesadores 80486DX y DX2!
El 18 de septiembre de 1995 Intel anuncia la disponibilidad de un nuevo modelo
procesador de mejora Pentium Overdrive a 83 MHz (además del modelo a 63
MHz que ya existía) que permite la actualización de los microprocesadores
80486 DX, DX2 y SX. Compatible pin a pin con estos microprocesadores en
Pentium Overdrive integra la tecnología del Pentium en 3,3 voltios y 0'6 micras.
Aparte de ser como un Pentium genuino cabe destacar la presencia de una
memoria cache de 32 Kb, un regulador de tensión para reducir la tensión de 5 a
3,3 voltios, disipador y ventilador integrado y una circuitería interna que
incrementa en dos veces y media la frecuencia del bus del sistema (33 MHz * 2'5
= 82'5 MHz). El incremento medio en las prestaciones respecto a un 80486 a 66
MHz es de un 50 por ciento aunque en aplicaciones puntuales (AutoCAD 13)
puede ser de un 96 por ciento, lo que lo sitúa en las prestaciones de un Pentium
genuino a 75 MHz. El precio de venta al público es de unas 40.000 pesetas más
IVA.
Antes de comprarlo os recomiendo que llevéis el ordenador a la tienda para que
sepan qué zócalo tiene para su actualización.
Pentium Pro
El Pentium Pro a 133 MHz, que fue
presentado el día 3 de noviembre de 1995 en
el hotel Ritz de Madrid es el primer
microprocesador de la tercera generación de
la gama Pentium. Está preparado
específicamente para ejecutar aplicaciones
compiladas y desarrolladas para 32 bits.
Algunas aplicaciones desarrolladas para
entornos de 16 bits tienen una reducción de
rendimiento en su ejecución en sistemas
basados en un Pentium Pro respecto a los
Pentium normales a 133 MHz. Perfectamente
compatible con sus hermanos menores incorpora nuevas mejoras, de las cuales
destaca la ejecución dinámica, tema al que dedicaremos un apartado especial y
la inclusión de una memoria cache secundaria integrada en el encapsulado del
chip.
Fabricado en una geometría de 0'6 micras, Intel está realizando sus desarrollos
con vistas a reducirla a 0'35 micras como la de los Pentium actuales a 133 MHz,
lo que reducirá su temperatura y podrá elevarse la frecuencia de reloj hasta los
200 MHz.
Intel ha puesto mucho esfuerzo en probar el Pentium Pro para intentar salvarse
de los numerosos bugs que manchan su gran prestigio. Intel nos ofreció
participar en las pruebas de sus Pentium Pro, petición a la cual respondimos
afirmativamente, pero al final, la drástica reducción de unidades nos hicieron
quedar fuera de los elegidos (sólo se probaron 100 unidades que estarían más
que asignadas de las más de 10.000 peticiones que recibió Intel a través de
Internet).
El Pentium Pro no es compatible con las placas que existen en el mercado. El
motivo principal es la inclusión de la memoria cache secundaria dentro del chip.
Se utiliza un bus interno que está optimizado para trabajar con las
temporizaciones de conexión directa, lo cual imposibilita la conexión de la
memoria cache externa (a mi entender no tiene la suficiente justificación,
puesto que a nivel de SETUP la memoria cache secundaria se puede desactivar e
incluso anular retirando los integrados de sus zócalos. El tema de la
sincronización ya es otro cantar y probablemente sea el motivo real).
Este nuevo producto tiene un bus que ha sido diseñado para conectar varios
Pentium Pro en paralelo que soporta el protocolo MESI, es un microprocesador
de 32 bits que incorpora una instrucción más (mover datos condicionalmente)
que supone una mayor predicción de ramificaciones en la ejecución. Tiene 21
millones de transistores, 5'5 millones en el núcleo y 15'5 millones en la memoria
cache secundaria. La CPU consta de dos chips colocados en cavidades
independientes conectadas internamente. El chip correspondiente a la memoria
cache es más pequeño que el del chip del núcleo, ya que la disposición de los
transistores permite una mayor concentración.
Ejecución dinámica
La ejecución dinámica es uno de los dos elementos clave en la ganancia de
prestaciones del Pentium Pro. Esta nueva forma de "pensar" del
microprocesador está basada en la combinación de tres técnicas: la predicción
de ramificaciones múltiples, el análisis del flujo de datos y la ejecución
especulativa.
Predicción de ramificaciones múltiples.
El Pentium Pro utiliza un algoritmo de predicción de ramificaciones múltiples
para anticipar saltos en la ejecución del flujo de instrucciones. Predice dónde
puede encontrar en la memoria las siguientes instrucciones que debe ejecutar
con una precisión del 90%. Esto lo logra porque además de extraer
instrucciones para su ejecución, se adelanta y busca anticipadamente posibles
nuevas instrucciones de programa.

Análisis del flujo de datos


El análisis del flujo de datos permite saber al microprocesador en qué orden
óptimo puede o debe ejecutar las instrucciones, ya que sabe la dependencia de
unas respecto a otras.

Ejecución especulativa
Cuando el Pentium Pro ejecuta instrucciones (5 por ciclo de reloj) utiliza la
ejecución especulativa. Esto significa que las instrucciones no se ejecutan en el
mismo orden con el que entran al microprocesador, sino que se ejecutan en un
"orden desordenado", lo que paradójicamente hace que sea más eficaz.
En el paso final, todos esos datos desordenados generados por la predicción de
ramificaciones, se ordenan y se ensamblan esos paquetes de unidades de
proceso para montar el orden lógico en la secuencia de ejecución del programa.

El futuro próximo de Intel


ntel está ya trabajando en sus modelos
P55C, P68 y P7. El P55C será una
versión Lite del Pentium Pro,
presumiblemente compatible pin a pin
con los zócalos de 80486 y estará
especialmente diseñado para ejecutar
aplicaciones de Windows 95. ¿Para cuándo tendrá el PC una ROM con rutinas
gráficas preprogramadas para su uso por el sistema operativo? Tendrá un precio
inferior al del Pentium Pro y parece que estará disponible a finales de 1996.
El P68 y el P7 corresponden a un nuevo escalón, ya que son micros de 64 bits
que se presentarán a lo largo de 1997. El primero es el sucesor del Pentium Pro
compatible con la familia x86, mientras que el P7 es una coproducción de Intel y
Hewlett-Packard que utilizará la tecnología PA-RISC de HP.
Resumiendo, Intel sigue con su política de "gástate un pastón en un ordenador
para después tirarlo".

ANEXOS
TECNOLOGÍA
INTEL LANZA UN CHIP DE ALTA CAPACIDAD
Intel ha anunciado el lanzamiento al mercado de un chip que ha despertado
esperanzas de un gran desarrollo de la industria informática y de las
capacidades de los microprocesadores, pero cuyo principio fundamental ya
existía desde 1995. El logro de este prodigioso chip está en que dobla la
capacidad de los transistores que lo forman. Hasta ahora, para aumentar las
capacidades de los procesadores se intentaba condensar miles de microscópicos
transistores en el menor espacio posible, para que cada uno de ellos almacenara
un bit. Lo que se consigue con esta tecnología es que cada transistor almacene
dos bits en vez de uno. Y se aspira a que en un futuro sean más de dos los bits
albergados en cada transistor.
El mayor fabricante de chips del mundo, presentó el nuevo chip el miércoles en
Japón. La novedad se aplicará en una primera fase a cámaras digitales,
teléfonos móviles y asistentes personales, pues consiste en memorias flash, las
que no se borran aunque el aparato se desconecte. Por ahora, no se usará en las
memorias RAM, las que usan los ordenadores, y que pierden lo almacenado
cuando se corta el fluido eléctrico. De todos modos, el nuevo chip abre un
número ilimitado de posibilidades, y una carrera por su aplicación con otros
fabricantes de chips que conocen métodos parecidos o que trabajan en otros
sistemas para aumentar la capacidad de los microprocesadores.
La tecnología de StrataFlash ya se conocía. En 1994 Intel anunció este sistema,
presentando un año después un prototipo que luego no desarrolló. Desde
entonces hasta hoy, otros fabricantes como Sandisk e ISD han utilizado
tecnología similar, aunque Intel ha sido la primera empresa en hacer su uso
posible a gran escala. Tanto que espera colocar en el mercado de 1 a1 10
millones de unidades de estos StrataFlash en 1998. La competencia no está
parada: ISD ya tiene chips que almacenan varios bits por transistor de manera
similar a StrataFlash, SanDisk dispone de un sistema parecido en sus tarjetas
PC, alcanzando capacidades de almacenamiento similares. Lucent Technologies
prepara para muy pronto otro tipo de procesadores de señal digital (DSP), un
tipo de chips utilizados en teléfonos celulares y estaciones de comunicación
digital, que siendo un 30% más baratos de los usados hoy, requieren sólo una
quinta parte de energía y memoria que los chips de la competencia. En el
terreno académico, la Universidad de North Carolina en Charlotte anunció el
descubrimiento de un chip capaz de usar tecnología eléctrica y óptica a la vez, lo
que aumenta su velocidad 100.000 veces en relación a los modelos actuales,
aunque de momento se trata sólo de un prototipo desarrollado por Raphael Su y
Qi Zhang, ingenieros eléctricos.
TECNOLOGÍA
EL ÚLTIMO CHIP DE SUN ALCANZA LOS 600 MHZ
En una carrera imparable plagada de nuevos chips cada vez más potentes y
métodos de fabricación innovadores, Sun Microsystems presentó el lunes un
potente microprocesador que alcanza los 600 Mhz de velocidad de reloj, un
rendimiento que dobla la nueva generación Pentium II recién estrenada por
Intel, que se presentó como un gran éxito con "sólo" 300 Mhz.
El nuevo chip de Sun, el UltraSparc-III constituye la tercera generación de su
familia Sparc, el corazón de las estaciones de trabajo y de los servidores de Sun.
Una de sus características más destacables es su escalabilidad, es decir, la
posibilidad de añadir más chips al mismo sistema, de manera que trabajando en
paralelo, multipliquen las posibilidades de esta tecnología. La empresa asegura
que mil de estos chips funcionando juntos pueden rivalizar con los
superordenadores más potentes de hoy. Las aplicaciones para la red forman
parte de la comercialización del prodigioso chip que, aplicado a los servidores,
les permitiría soportar un mayor número de usuarios, abasteciéndolos de más
información y más rápidamente que los modelos actuales. Los primeros de estos
servidores estarán preparados para el próximo verano, y se gobernarán por el
sistema operativo de la casa, el Solaris.
Sun se adelanta así a Intel, ya que el UltraSparc-III utiliza una tecnología de 64
bits, que Intel planeaba presentar como novedad en breves días bajo el nombre
clave de "Merced". Sin embargo, el gigante de los microprocesadores no se ha
quedado atrás y ha presentado a su vez una nueva generación de chips para
servidores conocidos como i960 RISC que, diseñados exclusivamente para redes
de telecomunicaciones, aceleran el tráfico de datos a través de este tipo de
máquinas gracias al protocolo I20. Marcas como Acer America, AST Computer,
Compaq, Dell, IBM, y Hewlett-Packard han anunciado ya que utilizarán este
chip en sus nuevos modelos de servidores, a presentar durante los próximos tres
meses.
Intel: un gigante en el Valle del Silicio
Pocas compañías pueden desafiar el claro dominio de Intel en la
industria de los semiconductores, ni siquiera las rivales de Japón y
Corea del Sur
Louise Kehoe FT Intel es una organización única en su categoría. El gigante del
Valle del Silicio _el fabricante de chips más grande del planeta, con un valor de
mercado superior a los 134 millardos de dólares_ produce la mayoría de los
microprocesadores empleados por la industria de la computación personal en
todo el planeta.
La enorme escala de las operaciones de Intel empequeñecen las de casi todos
sus rivales. La compañía cerró 1997 con un volumen de ventas anual de 25,1
millardos de dólares, un aumento significativo en comparación con los 20,8
millardos de dólares facturados en 1996. Gracias a un margen bruto de
ganancias cercano a 60%, la compañía genera ingresos a un ritmo que supera
con creces el de cualquiera de sus competidores.
Esto le permite a Intel invertir fuertes sumas en investigación y desarrollo de
productos, además de nuevas plantas y equipos. Este año, por ejemplo, Intel
tiene un presupuesto de investigación y desarrollo de 2,8 millardos de dólares y
planea desembolsar otros 5,3 millardos de dólares en nuevas líneas de
producción. Este monto triplica las inversiones que realizará en este campo
cualquier otro fabricante de semiconductores.
Si se toman en cuenta la participación dominante en el mercado de los
microprocesadores Pentium y el rápido ritmo de avance de la compañía en el
desarrollo de nuevas tecnologías, el liderazgo de Intel pudiera parecer
inexpugnable.
Sin embargo, varios cambios en el mercado de las computadoras personales
están creando nuevos desafíos para Intel, los cuales pudieran mermar su
crecimiento en el futuro. En particular, el lanzamiento al mercado de la 'PC
básica', que se vende en Estados Unidos por menos de mil dólares, ha obligado a
Intel a replantear su estrategia. La compañía mejora incesantemente el
rendimiento de sus microprocesadores, por lo que una PC comprada un año o
incluso seis meses atrás queda opacada por los nuevos modelos de mayor
velocidad.
En el pasado, con el lanzamiento al mercado de cada nueva generación de
microprocesadores, Intel solía disminuir los precios de las versiones anteriores,
por lo que los precios de PC permanecían bastante estables, al tiempo que el
rendimiento se incrementaba con celeridad. Microsoft y otras compañías de
software colaboraban en el ascenso de Intel mediante el desarrollo de
programas cada vez más complejos que requieren hardware más moderno.
Luego vino la 'PC básica' que, en términos generales, tiene como base un
microprocesador menos potente que alguno de los rivales de Intel. Al principio,
Intel restó importancia a esta nueva competencia. '¿Quién desearía una PC de
menor capacidad?', se preguntó retóricamente Intel. Empero, el precio de estas
máquinas resultaba muy conveniente y los compradores corrieron a comprarlas.
Se estima que el año pasado 25% de las computadoras personales vendidas en
EEUU se ubicaron en el segmento de equipos con precios inferiores a los mil
dólares. El crecimiento de este nuevo mercado tomó a Intel por sorpresa, lo que
obligo a la compañía a reevaluar la situación. Intel podía ofrecer sus
microprocesadores viejos para que se usaran en estas PC, pero ello mermaría los
márgenes de ganancias que constituyen el orgullo de la compañía. Fue por ello
que Intel anunció recientemente planes para desarrollar chips específicamente
diseñados para las PC de bajos precios.
En noviembre, Intel reorganizó sus grupos de productos para reflejar la nueva
estrategia. La compañía 'abarcará todos los segmentos' del mercado de la
computación, señaló Andrew Grove, director y presidente ejecutivo de Intel. A
mediados de año la empresa planea ofrecer una versión de su microprocesador
Pentium II para máquinas PC de bajo precio. La compañía reducirá el costo de
sus microprocesadores de máximo rendimiento mediante la eliminación de los
costosos chips de memoria que acompañan la versión actual. Esto colocará el
Pentium II en el mismo nivel de precios que los chips más lentos de sus
competidores.
Otro truco para reducir costos que Intel guarda bajo la manga es convertir
funciones actualmente realizadas por los chips en software que puede ser
ejecutado por el microprocesador. Aunque esto incrementa la carga de trabajo
del procesador central, también implica que incluso las computadoras
personales baratas necesitarán los microprocesadores de alto rendimiento de
Intel.
La compañía también aspira liderar el mercado de chips para las nuevas
generaciones de codificadores de TV, los cuales permitirán a los suscriptores de
televisión por cable conectarse a Internet. Asimismo, ha realizado importantes
incursiones en el mercado de servidores. El año pasado, la mayoría de los
servidores vendidos por menos de 25 mil dólares tenían microprocesadores
Intel.
En 1999, Intel lanzará al mercado una nueva generación de microprocesadores
identificados con el nombre clave de Merced, orientada hacia servidores más
complejos. Hewlett-Packard, que ocupa la segunda posición entre las compañías
de computación más grandes de Estados Unidos, colabora con Intel en el
desarrollo de Merced y planea diseñar sus próximos productos para que utilicen
chips de Intel.
Esto establecería los chips de Intel como el estándar dominante para servidores
y convertiría a la compañía en el máximo fabricante de microprocesadores de
toda la industria, un papel al que ninguna empresa puede aspirar.
Debido a que los fabricantes de chips más grandes de Japón y Corea del Sur
enfrentan una situación de inestabilidad económica, pocas compañías pueden
desafiar seriamente el dominio de Intel en la industria. Incluso si otro fabricante
de chips diseña un producto mejor que los de Intel, ninguno posee su capacidad
de producción.

Microprocesadores
1.- INTRODUCCIÓN
Desde la aparición del 8088 hace los principios de funcionamiento de los micros
no se han modificado mucho, a pesar de que ahora se ha llegado a la quinta
generación de estos chips y se ha profundizado en todo lo referente a las
prestaciones, en tema en los que hace diez años uno ni tan sólo se atrevía a
soñar. De todas maneras estas modificaciones se refieren especialmente a la
velocidad de trabajo del procesador con el cual se maneja el DOS, no al concepto
básico, por lo menos en lo referente al modo real.
Echemos de todas formas, en primer lugar, un vistazo a la historia del desarrollo
de los procesadores Intel.
La tarea del procesador es la de tratar las series de órdenes en lenguaje
máquina, pues el lenguaje máquina es el único que entiende el procesador. Las
instrucciones en el lenguaje máquina no son exactamente iguales para todos los
ordenadores, sino que solo son validas para el tipo de microprocesador en
cuestión. Los diferentes miembros de la familia 80xxx trabajan sin embargo con
el mismo lenguaje máquina, lo que permite que estos sean compatibles entre
ellos.
El primer representante de esta familia, el 8086, se desarrollo ya en el año 1978.
Sus sucesores fueron modificados de muchas maneras, y en parte fueron
modificados de forma radical, pero sin perder la compatibilidad con los
anteriores. En el caso del 8088 esto significó un paso hacia atrás, ya que si bien
el 8088 disponía del mismo grupo de instrucciones y la misma estructura
interna que el 8086, se comunicaba con la memoria mediante un bus de datos
de 8 bits, en lugar de 16 bits.
El resto de miembros de esta familia, son desarrollos posteriores del 8086. De
manera que por ejemplo el 80186 dispone de nuevas funciones adicionales,
mientras que al 80286 se le crearon mas registros en comparación al 8086, así
como también se le amplió el área de direcciones. La novedad mas decisiva del
80286 respecto a sus predecesores la representa el modo protegido, que sin
embargo no puede utilizarse con el DOS.
Al 80286 le siguió el 80386, que marcó un notable salto en la capacidad de
rendimiento. Continuó desarrollando el modo protegido y fue el primero de
disponer de un procesador Intel de registros de 32 bits, que sin embargo no
pudo utilizarse correctamente en la programación del DOS. Este procesador
existe también en una versión SX y DX, que se diferencian únicamente en la
frecuencia y en el tamaño del bus de dato; el SX trabaja con un bus de datos de
16 bits, mientras que el DX puede transmitir de una sola vez una palabra de 32
bits mediante su bus.
El micro que sigue al 80386, también llamado "i486" es el 80486. Este se
distingue especialmente del 80386 por la integración del coprocesador
numérico 80387, por la preparación de un código-caché y el tratamiento más
rápido de muchas instrucciones en lenguaje máquina, siendo también
compatible con el 8086.
El hito técnico actual lo marca el procesador Pentium que ha mejorado la
velocidad de proceso interna en relación con el 486. En determinadas
situaciones el procesador esta en situación de procesar dos ordenes consecutivas
al mismo tiempo, siempre y cuando la segunda no dependa del resultado de la
primera.
También la denominación en nueva en el Pentium puesto que se esperaba que
tras el 80486 el sucesor se denominaría 80586. Intel sin embargo rompió con la
tradición puesto que nombres como 8088 o 80486 no
pueden ser patentados. Esto lo aprovecharon durante largo tiempo otros
fabricantes de estos componentes para distribuir procesadores compatibles con
Intel, con otros nombres parecidos.
2.- REGISTROS DEL PROCESADOR
En el centro de todos los procesadores se encuentran sus registros, "variables de
hardware", en los cuales pueden cargarse datos de la memoria, tratarlos allí con
l a ayuda de las instrucciones del lenguaje máquina y finalmente volverlos a
escribir en la memoria. Esto es mucho más rápido que la manipulación de
información dentro de la memoria, ya que los registros se evacuan directamente
en el procesador y por lo tanto no es necesario acceder al bus para poner su
contenido a disposición de las instrucciones en lenguaje máquina. Por esta
razón los registros del procesador juegan un papel muy importante para la
programación del sistema, ya que es mediante estos registros que se desarrollan
el flujo de información entre un programa y las funciones del DOS y BIOS que
este llama.
Todos los registros tienen un tamaño de 16 bits (2 bytes). Así pueden registrar
un valor entre 0 y 65535 (111111111111111b, o FFFFh).
3.- El Procesador 386
El microprocesador 386 (también conocido como 386 DX) supone un paso muy
importante frente al 286. Hasta entonces, tanto los micros 8088 y 8086 como el
286 eran microprocesadores de 16 bits; trabajaban con 16 bits a la vez en cada
ciclo de reloj. Por el contrario, el 386 es un microprocesador de 32 bits, que
procesa 32 bits simultáneamente en cada ciclo de reloj. Los ordenadores 386
tienen una velocidad desde 16 a 50 Mhz.
El bus de direcciones del 386 tiene 32 bits. Con 32 bits se pueden redireccionar
232 celdas de memoria lo que equivale a 4096 MB. También en este caso los
primeros 1024 k se reparten como los micros 80886 y 286: 640k de memoria
convencional y los 364k restantes de memoria superior.
El microprocesador 80386 esta diseñado para soportar aquellos sistemas
operativos optimizados para multitarea. El micro 80386 es capaz de direccionar
hasta 4 gigabytes de memoria física y 64 tetrabytes de memoria virtual. La
gestión de memoria integrada y arquitectura de protección incluye registros de
traducción de direcciones y mecanismo de protección para soportar sistemas
operativos y hardware avanzado de multitarea.
El transvase entre instrucciones - pipelining -, una elevada anchura del bus y
una traducción de direcciones en la pastilla acortan significativamente el tiempo
medio de ejecución de la instrucción, manteniendo un alto rendimiento del
sistema. Estas características de diseño de arquitectura habilitan al 80386 a
ejecutar instrucciones a una frecuencia de 3 a 4 millones por segundo.
Características adicionales se incluyen autotest, acceso directo a la memoria
interna (cache) donde se realiza la traducción de página y cuatro nuevos
registros de "Breakpoint". El 80386 tiene el código objeto compatible con el
8086, 8088 y 80286.
El procesador 386SX
Los microprocesadores 386SX aparecieron después que el 386 como una
solución intermedia en precio y prestaciones entre el 286 y el 386. Los micros
386 puros (386DX) necesitan a su alrededor una circuiteria de 32 bits, mientras
que los SX necesitan una circuiteria de 16 bits, mucho mas barata. De esta
forma, los fabricantes podían utilizar todos los componentes y la circuitería de
16 bits que usaban para un 286, pero ahora incorporando un microprocesador
de 32 bits.
La diferencia entre un ordenador 386DX y un ordenador 386SX se percibe en la
velocidad del ordenador, pero desde el punto de vista de las aplicaciones que se
pueden ejecutar, es totalmente, indiferente tener un microprocesador 386DX
que un 386SX.
El procesador 386SL
El microprocesador 386SL es equivalente al 386SX con la particularidad de
estar diseñado especialmente para los ordenadores portátiles, cuidando sus
especiales necesidades de baja potencia y consumo. El 386SL posee un modo
sleep que utiliza menso energía durante su funcionamiento. Además, existen
nuevos recursos para poder minimizar el funcionamiento del ordenador (el
consumo de energía) cuando no se utiliza. El resultado es que la batería puede
doblar su tiempo en un portátil con 386SL frente a un 386SX. Los
microprocesadores 386SL sólo se utilizan en portátiles y notebooks y, hoy en
día, son los únicos microprocesadores 386 en los que continúa desarrollando y
trabajando.
Tipos de datos
La pastilla microprocesadora 80386 soporta varios tipos de datos además de los
soportados por sus predecesores (80x86). Soporta enteros con signo y sin signo
de 32 bits y campos de bits de 1 a 32 bits de
longitud. También soporta los tipos de punteros estándares, así como un
puntero de desplazamiento de 32 bits y un puntero completo de 48 bits.
Otros registros de 32 bits (ESI, EDI, EBP, ESP) no se pueden dividir en registros
de 16 bits. Por otra parte, el puntero de instrucciones EIP, también es un
registro de 32 bits, cuyo contenido se modifica dependiendo de los cambios que
experimente el flujo del programa que el procesador ejecute. Por lo tanto, EIP se
modifica implícitamente mediante instrucciones en código máquina.
ARQUITECTURA BASE
La pastilla microprocesadora 80386 proporciona al programador 32 registros.
Estos 32 registros pueden ser divididos en siete categorías principales.
- Registros de propósito general
- Registros de segmentos
- Puntero de instrucción y señalizaciones
- Registros de control
- Registros de direcciones del sistema
- Registros de test.
Estos registros son un superconjunto de los registros del 8086 y el 80286;
además, todos los registros de 16 bits del 8086 y el 80286 están contenidos en
el microprocesador 80386 de 32 bits.
REGISTROS DE PROPOSITO GENERAL
Los ocho registros de propósito general se utilizan de forma análoga a los ocho
registros de propósito general asociados al 80286, excepto que los registros
tienen ahora 32 bits. Estos registros son capaces de soportar operandos de datos
de 1, 8, 16 y 32 bits y campos de bits de 1 a 32 bits. Los ocho registros son el EAX
(acumulador), EBX (base), ECX (contador), EDX (datos), ESP (puntero de pila),
EBP (puntero base), ESI (índice fuente) y EDI (índice destino).
Para acceder a los 32 bits de un registro, todas las referencias del registro deben
comenzar "E". Cada uno de los ocho registros de propósito general puede ser
descompuesto en sus equivalentes de 16 bits del 8086/80286 referenciando los
registros sin usar el prefijo "E".
REGISTOS DE SEGMENTOS
El microprocesador 80386 contiene seis registros segmento de 16 bits. Los seis
registros segmento mantiene los valores del selector en las posiciones de
memoria actualmente direccionables. En modo de dirección real, un segmento
puede variar desde 1 byte hasta un tamaño de segmento máximo de 64 bytes, o
216. El direccionamiento en modo protegido habilita rangos de segmento desde 1
byte hasta un máximo de 4 gigabytes, o 232 bytes.

4.- Tecnologías Paralelas


COPROCESADOR MATEMÁTICO
El coprocesador matemático esta diseñado para que funcione en paralelo con el
microprocesador. El conjunto de instrucciones incluye muchas operaciones
extremadamente potentes en coma flotante.
Cuando el microprocesador encuentre una instrucción en coma flotante, envía
el código de operación necesario y direcciones de memoria de operandos al
coprocesador matemático. Esto libera al microprocesador de ejecutar la
siguiente instrucción, mientras el coprocesador matemático realiza
simultáneamente el cálculo numérico.
El coprocesador matemático puede hacer peticiones de acceso a memoria a
través de una canal de datos dedicado permanente en el microprocesador.
OVERDRIVE
El nombre de OverDrive no corresponde explícitamente a un microprocesador
de Intel, sino que se utiliza indistintamente para designar tanto un nuevo zócalo
que incluye algunas placas madres 486 como el microprocesador que se puede
insertar en dicho zócalo, que no es otro que un 486DX2. En definitiva,
OverDrive es sinónimo de insertar un nuevo microprocesador en la placa
madre, ya sea en un zócalo vacío dispuesto para tal fin o en el zócalo donde
reside el antiguo microprocesador. Hay que señalar que solo soportan
OverDrive las placas madres 486, ya sean 486DX o 486SX.
PROCESADOR Pentium
El Pentium es una CPU que, manteniendo la compatibilidad a nivel binario con
procesadores anteriores de la familia 80x86, introdujo en su día varias
características hasta entonces desconocidas para los programadores de esta
serie de micropocesadores.
Sin duda alguna, uno de los puntos más nefastos de la arquitectura 80x86 es el
limitado número de registros del procesador. Debemos tener en cuenta que, sin
embargo, esto es una consecuencia lógica al tratarse de una maquina CISC
(Complex Instruction Set Chip). Tradicionalmente los procesadores CISC han
estado dotado de un menor número de registros a cambio de un variado número
de instrucciones, mientras que sus competidores RISC (Reduced Instruction Set
Chip) gozan de una gran cantidad de registros a cambio de un menor número de
instrucciones.
El Pentium mantiene el mismo juego de registros que sus predecesores de 32
bits, el 386 y el 486, de forma que el programador dispone de registros con una
longitud de 32 bits. De estos registros 4 de ellos, denominados EAX, EBX, EFX
y EDX también se pueden manejar como registros de 16 bits, tomando en dicho
caso los nombre de AX, BX, CX, DX. Estos últimos registros de 16 bits pueden
manejarse, además, como pares de registros de 8 bits: AX se divide en AH y AL,
BX se divide en BH y BL, CX se divide en CH y CL, y, finalmente, DX lo hace en
DH y DL.
Otros registros de 32 bits (ESI, EDI, EBP, y ESP) no se pueden dividir en
registros de 16 bits. Por otra parte el puntero de instrucciones EIP, también es
un registros de 32 bits, cuyo contenido se modifica dependiendo de los cambios
que experimente el flujo del programa que el procesador ejectute. Por lo tanto
EIP se modifica explícitamente mediante instrucciones como CALL.
Para alcanzar un elevado rendimiento el Pentium es capaz de ejecutar, en teoría,
dos instrucciones de forma simultánea ya que el procesador dispone de dos
unidades de enteros y una más de coma flotante. Sin embargo la ejecución de
mas de dos instrucciones en paralelo tiene alguna restricciones, ya que el
Pentium impone algunas condiciones para que esto sea posible. En concreto,
solo se pueden ejecutar dos instrucciones en paralelo si cualquiera de ellas que
sea dependiente de los resultados producidos por otra anterior esta alejada de
esta al menos tres instrucciones.
Además el Pentium tiene algunas instrucciones implementadas directamente en
hardware y otras, debido a su complejidad lo están en microcódigo. Si una de las
instrucciones a ejecutar esta implementada de esta última forma no será posible
la ejecución en paralelo de dos instrucciones.
Intel dispone de modelos del procesador Pentium preparados para trabajar en
equipos multiprocesador con hasta cuatro CPUs. La principal diferencia entre
un Pentium normal y otro preparado para multiproceso, es la integración en el
chip de la APIC (Advanced Programmable Interrupt Controller).
Mediante la APIC integrada en el Pentium se forma un bus especial entre todos
los procesadores instalados en el sistema. A través de este bus un procesador
puede enviar mensajes y recibirlos de otra CPU.
El Pentium dispone también de una cache integrada de 16 KB, dividida en dos
bloques de 8 KB cada una, estando destinado uno de ellos a código y, el otros, a
datos. La actualización en memoria RAM de los datos contenidos en la cache
interna se lleva a cabo mediante los sistemas Write Back o Write Through,
ya que, al menos en modo protegido, esta característica es modificable mediante
software, si bien estos cambios no pueden realizarlos las aplicaciones ya que se
requiere un nivel de privilegio que, normalmente, no esta disponible para las
aplicaciones de los usuarios y solo determinadas capas del sistema operativo son
capaces de acceder a esta funcionalidad del procesador.
Desde el punto de vista del rendimiento, es mas eficiente la política Write
Back de actualización de la cache y de la memoria RAM del ordenador.
Mediante este sistema el contenido de la cache solo se vuelca a la RAM del
sistema cuando una línea de la cache es marcada como no valida. Por otro lado
el sistema Write Through, refleja de forma inmediata en la RAM del
ordenador cualquier cambio que se produzca en la cache del procesador, lo cual
produce un mayor consumo de ancho de banda del bus de la CPU.
Al contrario que ocurría con el 486, Intel no ha publicado la información técnica
necesaria para manejar directamente por software la memoria interna cache del
procesador. Por lo tanto, algunos trucos, que hacían posible dejar residentes de
forma permanente en la caché interna del 486 un bloque de código de datos, no
puede realizarse en el Pentium.

Fecha de Velocid Anch Numero Memoria Memori Breve


Introducci ad del o del de direcciona a Descripción
ón Reloj Bus transistor ble Virtual
es

Pentium 3/22/93 60MHz 32 3.1 4 64 La


® bits million gigabytes Arquitectura
66MHz terabyt
Superescala
Process (.8 es
75MHz r
or micron)
90MHz trajo la 5º
generación
100MHz
de la
120MHz
representaci
133MHz ón
150MHz del
procesador
166MHz
Intel486 DX
a 33-MHz

5.- Nuevas Tecnologías.


5.1 Procesadores MMX
La tecnología MMX es un mejor realce a la arquitectura Intel que convertirá a
los PCs en una mejor plataforma de Multimedia y Comunicaciones. Es el más
significativo en la arquitectura Intel desde el procesador i386. Este realce
incluye 57 nuevas instrucciones orientadas a operaciones altamente paralelas
con Multimedia y los tipos de datos en las Comunicaciones. Estas instrucciones
usan una técnica conocida como SIMD (Simple Instrucción, Múltiples Datos)
para dar un mejor rendimiento a la Multimedia y la computación de las
comunicaciones. Los procesadores que soportan la tecnología MMX serán
completamente compatibles con las generaciones anteriores de la Arquitectura
Intel y el software instalado.
La tecnología MMX demostrará la calidad de las aplicaciones Multimedia y de
las Comunicaciones. Por ejemplo, los juegos usarán 24-bits de color Real en
lugar de 8-bits, y con grandes ratios de frames. La tecnología MMX también
permitirá más actividades en tiempo real. Un ejemplo sería múltiples canales de
audio, vídeo de gran calidad y animación, y conexión a Internet, todo corriendo
en la misma aplicación. Esta tecnología MMX será incorporada en general en la
generación de procesadores P6.
Las aplicaciones Multimedia han empezado a dirigir los procesadores. Intel
formó un grupo de chips y algoritmos expertos para analizar vídeo interactivo,
realidad virtual, y aplicaciones en 3D de gran calidad. Se ha descubierto que
estas aplicaciones aparentemente diferentes tienen mucho en común. Hacen
mucha computación, muchas de ellas en paralelo, y tienden a usar pequeños
tipos de datos integer. Estas nuevas instrucciones - usando la arquitectura
SIMD - fueron específicamente seleccionadas para ayudar a incrementar la
velocidad de la esencia de estos algoritmos y mejorar así todas las aplicaciones.
Algunas de las aplicaciones que se beneficiarán de la tecnología MMX son los
gráficos 2D/3D, sonido, reconocimiento de voz, vídeo y compresión de datos. La
tecnología MMX es compatible con los entornos de SO. Además, el sistema
operativo no necesita modificación de la tecnología MMX para funcionar. Sin
embrago, las aplicaciones que más se beneficiarán cuando se incorpore esta
tecnología, tienden a ser las aplicaciones de Multimedia y Comunicaciones con
cierta cantidad de loops de computación-intensiva repetitivos donde la
información pueda ser organizada para ser procesada en paralelo.
Es importante destacar que las instrucciones MMX son nuevas instrucciones
que no existen en generaciones anteriores de los procesadores de Intel. El
soporte de la tecnología MMX debe estar en el procesador para que se ejecuten
estas instrucciones.
En lo que corresponde al Software para utilizar estas nuevas aplicaciones, se
debe usar la instrucción CPUID en tiempo de ejecución para comprobar el tipo
de procesador y saber si soporta esta tecnología. Si la soporta, se usarán las
DLLs que usen la tecnología MMX, sino se usarán las DLLs que usan las
instrucciones corrientes de la Arquitectura Intel.
Para terminar, los usuarios de Internet quieren interactuar con el mismo
entorno, por ejemplo sonido, vídeo y gráficos, como el usuario Multimedia. Se
espera que la tecnología MMX realzará los "plug ins" o los "helpers apps" se
convertirán muy comunes y activarán incluso mejor el contenido de internet en
los PCs con la tecnología MMX.
5.2 P6
Intel sostiene que el P6 es, aproximadamente, el doble de rápido que el
Pentium. Pero Intel está comparando el rendimiento estimado de un P6 de 133
Mhz (200 SPECint92) al de un Pentium de 100 Mhz (112,7 SPECint92). El P6
tiene superpipelines, de forma que su frecuencia de reloj es más alta.
Los conductos pipeline del P6 tienen hasta 14 etapas mientras que en el
Pentium tienen solamente 5. Las instrucciones se pueden mover más rápido por
el pipeline del P6 porque las etapas tienen tiempos de latencia más bajos.
Además, P6 posee otras muchas ventajas como pipelines de 3 vías, una
cache‚ secundaria integrada en el chip, un bus transaccional de entrada/salida y
más unidades de ejecución. Estas son exactamente las prestaciones que
distinguen una microarquitectura de otra.
Intel fabrica un Pentium de 133 Mhz con la misma tecnología de proceso que se
utiliza para el P6 (0,6 micras, BiCMOS metálico de 4 niveles).
El rendimiento estimado de un Pentium de 133MHz es de 150 SPECint92.
Entonces, un P6 que funcione a la misma velocidad de reloj viene a ser un 33%
más rápido, y no el doble de rápido.
Novedades del P6.
 En el núcleo de la CPU 5,5 millones de transistores, en la caché secundaria
integrada 15,5 millones.
 Microarquitectura superescalar de 3 vías.
 Superpipeline de 14 etapas.

 Cinco unidades de ejecución paralelas:


dos para enteros, una para
carga, una para almacenamiento y una para com flotante.
 8KB de caché primaria asociada de instrucciones de dos vías y 8 KB de
caché primaria asociativa de datos con cuatro vías.
 256 KB de cach‚ secundaria SRAM (RAM est tica) en un bus dedicado
con la misma velocidad que la CPU, integrada con ‚ esta en un solo
paquete PGA cerámico de 387 patillas de cavidad dual
 Bus transaccional de entrada/salida y jerarquía de caché no interferente.

 Ejecución de variación de orden, predicción din mica de bifurcaciones y


ejecución especulativa.
 Rendimiento proclamado por Intel: 200 SPECint92 a 133 MHz.
 Tecnología de proceso de fabricación BiCMOS metálica de cuatro niveles, 0,6
micras y 2,9 voltios.
 Superficie de la CPU: 306 mm2.
 Superficie de la SRAM: 202 mm2.
 Consumo energético estimado máximo: 20 vatios a 133 Mhz.
Comentarios
Para dejar un comentario, regístrese gratis o si ya está registrado, inicie
sesión.

Agregar un comentario Enviar comentario


Los comentarios están sujetos a los Términos y Condiciones

Historia de Intel
Publicado el 21 de January, 2008

Intel fue creada en 1968 por Gordon E. Moore y Robert Noyce. La


que empezó creando el corazón de calculadoras se ha convertido en estos 40 años en la
empresa más importante en lo que a microprocesadores se refiere. Tanto es así que se
llegó a conocer al modelo de ordenador por el nombre de su microprocesador Intel.
Pentium, Pentium II etc… Veamos el recorrido de esta gran empresa.

El origen de Intel Inside


Rozando la década de los 70 Gordon E. Moore y Robert
Noyce decidieron formar una empresa llamada Moore Noyce pero debido al equívoco
que provocaba el juego de palabras, lo cambiaron por Integrated Electronic. El resultado
de la unión de estas siglas es Intel. El nombre ya estaba en uso por una empresa hotelera
así que Moore y Noyce compraron los derechos para poder utilizarlo.

En sus inicios se dedicaban a la creación de memorias, las de más éxito fueron DRAM,
SRAM y ROM. En 1971, tan sólo 3 años después de su inauguración, crearon el primer
microprocesador. Al contrario de lo que nos puede parecer por lo que conocemos de la
empresa, el 4004 no era el microprocesador de un ordenador. Se trataba de un encargo
para Busicom, una empresa japonesa que planeaba sacar al mercado una nueva
calculadora.

Este primer microprocesador fue creado gracias al ingenio de Ted Hoff que diseñó un
chip con una memoria capaz de hacer varias acciones. Este chip es el elemento clave del
cuerpo del microprocesador. Posee 4 chips como éste y dos más de memoria. El gran
avance era que ya no hacía falta crear un circuito integrado para cada parte de la
calculadora, sólo hacía falta uno, el 4004.

Esta claro y es indiscutible que éste fue el primer microprocesador de Intel. Muchos le
atribuyen también el mérito de ser el primero de la historia pero como siempre ocurre en
la informática ante una afirmación tan contundente surge la polémica y otros consideran
que el mérito es de Texas Instruments.

El inicio del casi monopolio

El 4004 era capaz de hacer 60.000 operaciones por segundo, visto su éxito Intel
continuó investigando en el campo y poco después sacaba al mercado el 8008, capaz de
transmitir el doble de datos, acceder a más memoria, procesar a 8 bits y alcanzar una
velocidad de 740 Khz. Era el inicio de la alta velocidad, Intel se incorporaba a aparatos
de gasolineras, aeropuertos, salones recreativos, etc.

Intel Corporation se centra en el mundo de los microprocesadores rechazando entrar en


el que parece que es el mercado del momento, las computadoras. Su gran oportunidad
llega de la mano de IBM en 1980.

La mayoría de nosotros conocemos a IBM por su papel en el mundo de la informática y


los ordenadores pero el gigante azul existía mucho antes de integrarse en este mundillo.
En 1980 da el gran paso y se pone en contacto con diversas empresas especializadas
para comprarles la pieza que formaría parte del IBM PC. La empresa escogida para que
participe con su microprocesador es Intel.
El IBM PC sale al mercado en 1981, con los microprocesadores de Intel, el 8088 con un
chip de 8 bits trabajando a 4,77 MHz y el 8086 cuyo chip era de 16 bits. El IBM PC se
vendía a diferentes precios según sus prestaciones. De los dos microprocesadores de
Intel, el que tuvo mayor acogida en el mercado fue el 8088 ya que tan sólo les
diferenciaban 8 bits y el segundo era mucho más económico. Las características de los
microprocesadores más famosos de la historia son:

• 8 o 16 bits
• Velocidad de reloj: 5, 8 y 10 Mhz
• 29.000 transistores usando energía de 3 micras
• 1 Mega de memoria direccionable

Este ordenador fue también el primero en disponer de MS-DOS como sistema


operativo.

IBM fue creada a finales del siglo XIX, en todo ese tiempo consiguió hacerse un
nombre en el mercado. La gran confianza que había conseguido depositar en la gente se
vio reflejada en el gran éxito de su primera computadora personal. El modelo de IBM se
convertiría en un estándar cuando el resto de fabricantes viendo el éxito que tenía
trataron de copiar su equipo.

Así pues IBM compartió fama y éxito con Microsoft (por su sistema operativo MS-
DOS) y con Intel por su procesador. Era sólo cuestión de tiempo que Intel se hiciera con
las cuotas más altas del mercado. La que empezara con un equipo de 12 expertos estaba
camino de convertirse en una de las empresas más importantes en el mundo de la
informática, una multinacional sin sombra a la que han llegado a acusar de monopolio.

Los sucesores del procesador 8086

El siguiente paso de Intel fue crear en 1982 la nueva saga de microprocesadores con un
diseño mucho más moderno y parecido al actual. Se trataba de 80286, 80386, 80386 XS
y 80486DX aunque fueron más conocidos por sus tres últimos números: 286, 386, etc.

Los microprocesadores 80286 y 80386SX

Este microprocesador fue creado en 1982, en un principio lo utilizaría IBM para su PC.
Pero el sistema de “licencias cruzadas” permitió la aparición de Compaq, una empresa
que se dedicó a hacer ordenadores clónicos en masa. Surgió en 1985 lanzando al
mercado el clónico de IBM. Compaq convirtió así al 286 en el primer microprocesador
utilizado para hacer clónicos. Sus características son:

• Velocidad de entre 6 y 25 Mhz.


• Primero que permite el uso de memoria virtual.
• Soporta 1 Giga de memoria virtual.

En 1988 aparece una simplificación del 286. El 80386SX es, a grandes rasgos, el mismo
microprocesador pero con una arquitectura más simple y barata, de 16 bits. La aparición
de estos microprocesadores coincidía con la del entorno gráfico de Windows que había
sido desarrollado unos años antes pero que aún no conseguía la plena aceptación del
público.
El microprocesador 80386

El 386 fue creado en 1986 y se siguió fabricando hasta que en el 2006 Intel anunció el
cese de su producción. La principal característica era su arquitectura de 32 bits. Además
tenía una velocidad de entre 16 y 40 MHz.

El microprocesador 80486DX

En 1989 llega el Intel 80486DX. Basado en 32 bits y con dos novedades:

• Caché nivel 1. Que aceleraba la transferencia de datos del caché al


microprocesador.
• Co-procesador matemático.
• El 486 del mismo año alcanzaba velocidades de entre 16 y 100Mhz.

Todos conocen a Pentium

En 1989 un fallo judicial prohibía que se usaran números para dar nombre a los
microprocesadores por lo empezaba el tiempo de los Pentium. A estas alturas los
procesadores de Intel eran tan conocidos y utilizados que a menudo el público se refería
a un modelo de ordenador por el nombre de su procesador Intel. Frases como “me he
comprado un Pentium II” estaban integradas en la cultura popular.

El primer Pentium data de mayo de 1993, estos microprocesadores partían de una


velocidad de 60 MHz y llegaron a superar lo inimaginable en su época, los 200 MHz.
Las innovaciones más destacables que surgirían después fueron: el Pentium Pro,
Pentium II, Pentium D y Core 2 Duo, la tecnología móvil Centrino desarrollada para el
mercado de portátiles y la tecnología HyperThreading, integrada en los procesadores
Intel Pentium 4.

Aunque hasta el momento tan sólo hemos hecho referencia a la relación entre Intel y Pc
debemos destacar que a lo largo de esta historia Intel ha firmado también contratos con
Apple y otros fabricantes desarrollando así microprocesadores pasa sus computadoras.

A día de hoy uno de los productos más novedosos de Intel es el procesador Intel®
Core™2 Duo. Según la propia empresa, permite realizar más tareas a la vez aunque
sean “pesadas” sin abandonar la protección del antivirus. Además, se puede actualizar
fácilmente el PC a aplicaciones de 64 bits y al sistema operativo Windows Vista
Premium*.

Que sea el mayor fabricante de microprocesadores y el que tiene más cuota de mercado
con diferencia no implica necesariamente que sea el mejor. Para muchos, Intel es
superado por AMD, prestigioso fabricante de microprocesadores con cuotas de mercado
muy inferiores a las de Intel pero el único capaz de hacerle un mínimo de sombra.

Expertos en el tema recomiendan comparar las dos marcas utilizando un procesador de


cada una en la misma máquina. Este experimento que no está al alcance de todos pero
que puede resultar realmente útil.

También podría gustarte