El microprocesador Intel 8088 (" eighty-eighty-eight ", también llamado iAPX 88 ) [2] [3] [4] es una variante del Intel 8086. Introducido el 1 de junio de 1979, [5] [6] [7] [8] el 8088 tiene un bus de datos externo de ocho bits en lugar del bus de 16 bits del 8086. Sin embargo, los registros de 16 bits y el rango de direcciones de un megabyte no han cambiado. De hecho, según la documentación de Intel, el 8086 y el 8088 tienen la misma unidad de ejecución (EU), solo la unidad de interfaz de bus (BIU) es diferente. El 8088 se utilizó en el IBM PC original y en clones compatibles con IBM PC .
El 8088 fue diseñado en el laboratorio de Intel en Haifa , Israel , al igual que una gran cantidad de procesadores de Intel. [9] El 8088 estaba destinado a sistemas económicos al permitir el uso de una ruta de datos de ocho bits y chips periféricos y de soporte de ocho bits; las placas de circuitos complejas todavía eran bastante engorrosas y caras cuando se lanzó. La cola de precarga del 8088 se acortó a cuatro bytes, de los seis bytes del 8086, y el algoritmo de precarga se modificó ligeramente para adaptarse al bus más estrecho. [a] Estas modificaciones del diseño básico del 8086 fueron uno de los primeros trabajos asignados a la nueva oficina de diseño y laboratorio de Intel en Haifa.
Las variantes del 8088 con una frecuencia de reloj máxima de más de 5 MHz incluyen el 8088-2, que se fabricó utilizando el nuevo proceso nMOS mejorado de Intel llamado HMOS y especificado para una frecuencia máxima de 8 MHz. Más tarde siguió el 80C88, un diseño CHMOS completamente estático , que podía operar con velocidades de reloj de 0 a 8 MHz. También hubo varias otras variantes, más o menos similares, de otros fabricantes. Por ejemplo, el NEC V20 era una variante compatible con pines y ligeramente más rápida (a la misma frecuencia de reloj) del 8088, diseñado y fabricado por NEC . Los sucesivos procesadores NEC 8088 compatibles funcionarían a hasta 16 MHz. En 1984, Commodore International firmó un acuerdo para fabricar el 8088 para su uso en un clon Dynalogic Hyperion con licencia , en un movimiento que se consideró como una señal de una nueva dirección importante para la empresa. [10] La versión CMOS disponible fue subcontratada a Oki Electronic Industry Co., Ltd. [11] Cuando se anunció, el precio de lista del 8088 era de US$124,80. [12] [13] La versión con paquete de plástico se introdujo en julio de 1981 por US$14,10 por 100 en cantidades. [14] Intel suministró este microprocesador a Fujitsu Limited . [15]
El 8088 es arquitectónicamente muy similar al 8086. La principal diferencia es que sólo hay ocho líneas de datos en lugar de las 16 líneas del 8086. Todos los demás pines del dispositivo realizan la misma función que en el 8086 con dos excepciones. En primer lugar, el pin 34 ya no es BHE (ésta es la selección de byte de orden superior en el 8086; el 8088 no tiene un byte de orden superior en su bus de datos de ocho bits). [16] : 5–97 En su lugar, emite un estado de modo máximo, SS0 . Combinado con las señales IO/ M y DT/ R , los ciclos de bus se pueden decodificar (generalmente indica cuando una operación de escritura o una interrupción está en progreso). El segundo cambio es el pin que señala si se está realizando un acceso a la memoria o un acceso de entrada/salida ha invertido su sentido. El pin en el 8088 es IO/ M . En la parte 8086 es IO /M. El motivo de la inversión es que hace que el 8088 sea compatible con el 8085. [ 16] : 5–98
Dependiendo de la frecuencia de reloj , el número de estados de espera de memoria , así como de las características del programa de aplicación particular, el rendimiento promedio para el Intel 8088 osciló aproximadamente entre 0,33 y 1 millón de instrucciones por segundo . [17] Mientras tanto, las instrucciones y , que toman dos y tres ciclos respectivamente, produjeron un rendimiento máximo absoluto de entre 1 ⁄ 3 y 1 ⁄ 2 MIPS por MHz, es decir, en algún lugar en el rango de 3 a 5 MIPS a 10 MHz.mov reg,reg
ALU[b] reg,reg
La velocidad de la unidad de ejecución (UE) y el bus de la CPU 8086 estaban bien equilibrados; con una combinación de instrucciones típica, un 8086 podía ejecutar instrucciones de la cola de precarga durante una buena parte del tiempo. Reducir el bus a ocho bits lo convirtió en un serio cuello de botella en el 8088. Con la velocidad de carga de instrucciones reducida en un 50% en el 8088 en comparación con el 8086, una secuencia de instrucciones rápidas puede agotar rápidamente la cola de precarga de cuatro bytes. Cuando la cola está vacía, las instrucciones tardan tanto en completarse como en cargarse. Tanto el 8086 como el 8088 tardan cuatro ciclos de reloj en completar un ciclo de bus; mientras que para el 8086 esto significa cuatro relojes para transferir dos bytes, en el 8088 son cuatro relojes por byte. Por lo tanto, por ejemplo, una instrucción de desplazamiento o rotación de dos bytes, que le toma al EU solo dos ciclos de reloj para ejecutarse, en realidad le toma ocho ciclos de reloj para completarse si no está en la cola de precarga. Una secuencia de instrucciones tan rápidas evita que la cola se llene tan rápido como se vacía y, en general, debido a que muchas instrucciones básicas se ejecutan en menos de cuatro ciclos de reloj por byte de instrucción (incluidas casi todas las instrucciones de ALU y de movimiento de datos en operandos de registro y algunas de estas en operandos de memoria), es prácticamente imposible evitar que el EU esté inactivo en el 8088 al menos 1 ⁄ 4 del tiempo mientras se ejecutan programas útiles del mundo real, y no es difícil dejarlo inactivo la mitad del tiempo. En resumen, un 8088 normalmente funciona aproximadamente la mitad de rápido que un 8086 con la misma velocidad, debido al cuello de botella del bus (la única diferencia importante).
Un efecto secundario del diseño del 8088, con el bus lento y la cola de precarga pequeña, es que la velocidad de ejecución del código puede depender mucho del orden de las instrucciones. Al programar el 8088, para la eficiencia de la CPU, es vital intercalar instrucciones de larga ejecución con instrucciones cortas siempre que sea posible. Por ejemplo, una operación repetida de cadena o un desplazamiento de tres o más bytes tardará lo suficiente como para permitir que la cola de precarga de 4 bytes se llene por completo. Si se colocan instrucciones cortas (es decir, las que suman unos pocos bytes) entre instrucciones más lentas como estas, las cortas se pueden ejecutar a toda velocidad fuera de la cola. Si, por otro lado, las instrucciones lentas se ejecutan secuencialmente, una tras otra, entonces después de la primera de ellas la unidad de bus se verá obligada a permanecer inactiva porque la cola ya estará llena, con la consecuencia de que más adelante más instrucciones más rápidas sufrirán demoras de carga que podrían haberse evitado. Como algunas instrucciones, como los cambios de posición de un solo bit y las rotaciones, tardan literalmente cuatro veces más en obtenerse que en ejecutarse, [c] el efecto general puede ser una ralentización de un factor de dos o más. Si esos segmentos de código son los cuerpos de los bucles, la diferencia en el tiempo de ejecución puede ser muy notable en la escala de tiempo humana.
El 8088 también es lento (al igual que el 8086) en el acceso a la memoria. La misma ALU que se utiliza para ejecutar instrucciones aritméticas y lógicas también se utiliza para calcular direcciones efectivas. Hay un sumador independiente para añadir un registro de segmento desplazado a la dirección de desplazamiento, pero el desplazamiento EA en sí siempre se calcula por completo en la ALU principal. Además, el acoplamiento débil de la UE y la BIU (unidad de bus) inserta una sobrecarga de comunicación entre las unidades, y el ciclo de transferencia de bus de cuatro períodos de reloj no está particularmente optimizado. Compare esto con el ciclo de bus de dos períodos de reloj de la CPU 6502 y el ciclo de bus de tres períodos de reloj del 80286 con la reducción a dos ciclos para la mayoría de las transferencias. La mayoría de las instrucciones del 8088 que pueden operar en registros o en memoria, incluidas las operaciones comunes de ALU y de movimiento de datos, son al menos cuatro veces más lentas para los operandos de memoria que para los que solo funcionan con registros. Por lo tanto, los programas eficientes 8088 (y 8086) evitan el acceso repetido a los operandos de la memoria cuando es posible, cargando los operandos de la memoria en registros para trabajar con ellos allí y almacenando de nuevo sólo los resultados finales. El conjunto de registros generales relativamente grande del 8088 en comparación con sus contemporáneos ayuda a esta estrategia. Cuando no hay suficientes registros para todas las variables que se necesitan a la vez, guardar registros empujándolos a la pila y sacándolos de nuevo para restaurarlos es la forma más rápida de usar la memoria para aumentar los registros, ya que las instrucciones PUSH y POP de la pila son las operaciones de memoria más rápidas. Probablemente no sea lo mismo en el 80286 y posteriores; tienen ALU de dirección dedicadas y realizan accesos a la memoria mucho más rápido que el 8088 y el 8086.
Por último, debido a que las llamadas, los saltos y las interrupciones reinician la cola de prefetch, y debido a que la carga del registro IP requiere comunicación entre la UE y la BIU (ya que el registro IP está en la BIU, no en la UE, donde están los registros generales), estas operaciones son costosas. Todos los saltos y llamadas toman al menos 15 ciclos de reloj. Cualquier salto condicional requiere cuatro ciclos de reloj si no se realiza, pero si se realiza, requiere 16 ciclos además de reiniciar la cola de prefetch; por lo tanto, los saltos condicionales deben organizarse para que no se realicen la mayor parte del tiempo, especialmente dentro de bucles. En algunos casos, una secuencia de operaciones lógicas y de movimiento es más rápida que un salto condicional que se salta una o dos instrucciones para lograr el mismo resultado.
Las hojas de datos de Intel para el 8086 y el 8088 anunciaban las instrucciones dedicadas a multiplicar y dividir (MUL, IMUL, DIV e IDIV), pero son muy lentas, del orden de 100 a 200 ciclos de reloj cada una. Muchas multiplicaciones simples por pequeñas constantes (además de las potencias de 2, para las que se pueden usar desplazamientos) se pueden realizar mucho más rápido utilizando subrutinas cortas dedicadas. El 80286 y el 80386 aumentan en gran medida la velocidad de ejecución de estas instrucciones de multiplicación y división. [d]
El IBM PC original es el microordenador más influyente en utilizar el 8088. Tiene una frecuencia de reloj de 4,77 MHz (4/3 de la frecuencia de colorburst NTSC ). Algunos de los ingenieros de IBM y otros empleados querían utilizar el procesador IBM 801 , algunos preferían el nuevo Motorola 68000 , [e] y otros abogaban por un microprocesador pequeño y sencillo, como el MOS Technology 6502 o el Zilog Z80 , que se encuentran en ordenadores personales anteriores. Sin embargo, IBM ya tenía un historial de uso de chips Intel en sus productos y también había adquirido los derechos para fabricar la familia 8086. [f]
IBM eligió el 8088 en lugar del 8086 porque Intel ofrecía un mejor precio para el primero y podía suministrar más unidades. [18] Otro factor fue que el 8088 permitió que la computadora se basara en un diseño 8085 modificado , ya que podía interactuar fácilmente con la mayoría de los chips nMOS con buses de datos de 8 bits. Se trataba de componentes maduros y, por lo tanto, económicos. Esto incluía circuitos integrados originalmente pensados para funciones periféricas y de soporte en torno al 8085 y procesadores similares (no exclusivamente de Intel), que ya eran bien conocidos por muchos ingenieros, lo que reducía aún más el coste. [g]
Los descendientes del 8088 incluyen los procesadores 80188 , 80186 , 80286 , 80386 , 80486 y posteriores compatibles con software , incluidos los procesadores Intel Core , que son populares hoy en día.