TRABAJO DE MICROPROCESADORES

PROFESOR:

DR: ROCCO TARANTINO

PRESENTADO POR:

ELKIN JOSE RUIZ MONTES

9021777

GREY FERNANDO VEGA

8898503

INDICE

I. EVOLUCION DEL MICROPROCESADOR
II. ARQUITECTURA INTERNA
III. MODELO DE PROGRAMACION
IV. CONJUNTO DE INSTRUCCIONES (486)
V. MODO DE DIRECCIONAMIENTO
VI. FORMATO DE DATOS
VII. LENGUAJE MAQUINA
-Microcódigo
-Código de instruccion
VIII. PILA
IX. DESCRIPCION DEL FUNCIONAMIENTO DE LAS INSTRUCCIONES
CONCLUSION

I. EVOLUCION DEL MICROPROCESADOR

Con la aparición de los circuitos integrados, la posibilidad de reducir el tamaño de algunos dispositivos electrónicos se vio enormemente favorecida. Los fabricantes de controladores integrados, calculadoras y algunos otros dispositivos comenzaron a solicitar sistemas integrados en una sola pastilla, esto dio origen a la aparición de los microprocesadores.

Microprocesadores de 4 bits:

En 1971, una compañía que se dedicaba a la fabricación de memorias electrónicas lanzó al mercado el primer microprocesador del mundo. Este microprocesador fue el resultado de un trabajo encargado por una empresa que se dedicaba a la fabricación de calculadoras electrónicas. El 4004 era un microprocesador de 4 bits capaz de direccionar 4096 localidades de memoria de 4 bits de ancho. Este microprocesador contaba con un conjunto de 45 instrucciones y fue ampliamente utilizado en los primeros videojuegos y sistemas de control.

Microprocesadores de 8 bits:

Con la aparición de aplicaciones más complejas para el microprocesador y el gran éxito comercial del 4004, Intel decidió lanzar al mercado un nuevo microprocesador, el 8008, éste fue el primer microprocesador de 8 bits. Las características de este microprocesador fueron:

Capacidad de direccionamiento de 16 Kb

Memoria de 8 bits

Conjunto de 48 instrucciones

Este microprocesador tuvo tanto éxito, que en cosa de dos años su capacidad de proceso fue insuficiente para los ingenieros y desarrolladores, por lo cual en 1973 se liberó el 8080. Este microprocesador fue una versión mejorada de su predecesor y las mejoras consistieron en un conjunto más grande de instrucciones, mayor capacidad de direccionamiento y una mayor velocidad de procesamiento.

Finalmente, en 1977, Intel anunció la aparición del 8085. Este era el último microprocesador de 8 bits y básicamente idéntico al 8080. Su principal mejora fue la incorporación del reloj temporizador dentro de la misma pastilla.

Microprocesadores de 16 bits

En 1978, Intel lanzó al mercado el 8086 y un poco más tarde el 8088. Estos dos microprocesadores contaban con registros internos de 16 bits, tenían un bus de datos externo de 16 y 8 bits respectivamente y ambos eran capaces de direccionar 1Mb de memoria por medio de un bus de direcciones de 20 líneas.

Otra característica importante fue que estos dos microprocesadores eran capaces de realizar la multiplicación y la división por hardware, cosa que los anteriores no podían.

Finalmente apareció el 80286. Este era el último microprocesador de 16 bits, el cual era una versión mejorada del 8086. El 286 incorporaba una unidad adicional para el manejo de memoria y era capaz de direccionar 16Mb en lugar de 1Mb del 8086.

Microprocesadores de 32 bits

El 80386 marco el inicio de la aparición de los microprocesadores de 32 bits. Estos microprocesadores tenían grandes ventajas sobre sus predecesores, entre las cuales se pueden destacar: direccionamiento de hasta 4Gb de memoria, velocidades de operación más altas, conjuntos de instrucciones más grandes y además contaban con memoria interna (caché) de 8Kb en las versiones más básicas. Del 386 surgieron diferentes versiones, las cuales se listan a continuación:

II. ARQUITECTURA INTERNA 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:

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.

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.

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

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

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.

BP = Puntero base (no se puede subdividir).

Generalmente se utiliza para realizar direccionamiento indirecto dentro de la pila.

SI = Puntero índice (no se puede subdividir).

Sirve como puntero fuente para las operaciones con cadenas. También sirve para realizar direccionamiento indirecto.

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

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.

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:

GND (Masa)

A14 (Bus de direcciones)

A13 (Bus de direcciones)

A12 (Bus de direcciones)

A11 (Bus de direcciones)

A10 (Bus de direcciones)

A9 (Bus de direcciones)

A8 (Bus de direcciones)

AD7 (Bus de direcciones y datos)

AD6 (Bus de direcciones y datos)

AD5 (Bus de direcciones y datos)

AD4 (Bus de direcciones y datos)

AD3 (Bus de direcciones y datos)

AD2 (Bus de direcciones y datos)

AD1 (Bus de direcciones y datos)

AD0 (Bus de direcciones y datos)

NMI (Entrada de interrupción no enmascarable)

INTR (Entrada de interrupción enmascarable)

CLK (Entrada de reloj generada por el 8284)

GND (Masa) RESET (Para inicializar el 8088)

READY (Para sincronizar periféricos y memorias lentas)

/TEST /INTA (El 8088 indica que reconoció la interrupción)

ALE (Cuando está uno indica que salen direcciones por AD, en caso contrario, es el bus de datos)

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

DT/R (Data transmit/receive: se conecta al pin de dirección de los chips recién indicados).

IO/M (Si vale 1: operaciones con ports, si vale 0: operaciones con la memoria)

/WR (Cuando vale cero hay una escritura)

HLDA (Hold Acknowledge: el 8088 reconoce el HOLD) HOLD (Indica que otro integrado quiere adueñarse del control de los buses, generalmente se usa para DMA o acceso directo a memoria).

/RD (Cuando vale cero hay una lectura)

MN/MX (Cuando esta entrada está en estado alto, el 8088 está en modo mínimo, en caso contrario está en modo máximo)

/SSO (Junto con IO/M y DT/R esta salida sirve para determinar estados del 8088)

A19/S6 (Bus de direcciones/bit de estado)

A18/S5 (Bus de direcciones/bit de estado)

A17/S4 (Bus de direcciones/bit de estado)

A16/S3 (Bus de direcciones/bit de estado)

A15 (Bus de direcciones) 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.

III. MODELO DE PROGRAMACION

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 INDICES:

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=BANDERAS):

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.

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

IV. EL MICROPROCESADOR 80486

BLOQUES QUE COMPONEN EL 80486:

Este microprocesador es básicamente un 80386 con el agregado de una unidad de punto flotante compatible con el 80387 y un caché de memoria de 8 KBytes. Por lo tanto los bloques que componen el 80486 son los siguientes:

Unidad de ejecución: Incluye los registros de uso general de 32 bits, la unidad lógico-matemática y un barrel shifter de 64 bits. La unidad de ejecución está mejorada con lo que se necesita un sólo ciclo de reloj para las instrucciones más frecuentes.

Unidad de segmentación: Incluye los registros de segmento, los cachés de información de descriptores y la lógica de protección. No tiene diferencias con respecto al 80386.

Unidad de paginación: Es la encargada de traducir las direcciones lineales (generadas por la unidad anterior) en direcciones físicas. Incluye el buffer de conversión por búsqueda (TLB). Los últimos modelos (DX4, algunos DX2) soportan páginas de 4MB aparte de las de 4KB del 80386.

Unidad de caché: La evolución de las memorias hizo que el tiempo de acceso de las mismas decrecieran lentamente, mientras que la velocidad de los microprocesadores aumentaba exponencialmente. Por lo tanto, el acceso a memoria representaba el cuello de botella.

La idea del caché es tener una memoria relativamente pequeña con la velocidad del microprocesador. La mayoría del código que se ejecuta lo hace dentro de ciclos, con lo que, si se tiene el ciclo completo dentro del caché, no sería necesario acceder a la memoria externa. Con los datos pasa algo similar: también ocurre un efecto de localidad. El caché se carga rápidamente mediante un proceso conocido como "ráfaga", con el que se pueden transferir cuatro bytes por ciclo de reloj.

Interfaz con el bus: Incluye los manejadores del bus de direcciones (con salidas de A31-A2 y BE0# a BE3# (mediante esto último cada byte del bus de datos se habilita por separado)), bus de datos de 32 bits y bus de control.

Unidad de instrucciones: Incluye la unidad de prebúsqueda que le pide los bytes de instrucciones al caché (ambos se comunican mediante un bus interno de 128 bits), una cola de instrucciones de 32 bytes, la unidad de decodificación, la unidad de control, y la ROM de control (que indica lo que deben hacer las instrucciones).

Unidad de punto flotante: Incluye ocho registros de punto flotante de 80 bits y la lógica necesaria para realizar operaciones básicas, raíz cuadrada y trascendentes de punto flotante. Es tres o cuatro veces más rápido que un 386DX y 387DX a la misma frecuencia de reloj. Esta unidad no está incluida en el modelo 486SX.

Unidad de caché: Estos procesadores tienen un caché interno que almacena 8KB de instrucciones y datos excepto el DX4 y el Write-back enhanced DX4 que tienen 16KB de caché interno. El caché aumenta el rendimiento del sistema ya que las lecturas se realizan más rápido desde el caché que desde la memoria externa. Esto también reduce el uso del bus externo por parte del procesador. Éste es un caché de primer nivel (también llamado L1). El procesador 80486 puede usar un caché de segundo nivel (también llamado L2) fuera del chip para aumentar aún más el rendimiento general del sistema.

Si bien la operación de estos cachés internos y externos son transparentes a la ejecución de los programas, el conocimiento de su funcionamiento puede servir para optimizar el software.

El caché está disponible en todos los modos de funcionamiento del procesador: modo real, modo protegido y modo de manejo del sistema.

Funcionamiento: El caché es una memoria especial, llamada memoria asociativa. Dicha memoria tiene, asociado a cada unidad de memoria, un tag, que almacena la dirección de memoria que contiene los datos que están en la unidad de memoria.

Cuando se desea leer una posición de memoria mediante esta memoria asociativa, se comparan todos los tags con esta dirección. Si algún tag tiene esta dirección, se dice que hubo un acierto (cache hit en inglés) con lo que se puede leer la información asociada a ese tag. En caso contrario hay un fallo (cache miss en inglés), con lo que hay que perder un ciclo de bus para leer el dato que está en memoria externa. En el caso del 80486, cada unidad de memoria son 16 bytes. Esta cantidad es una línea del caché.

Las líneas pueden ser válidas (cuando contienen datos de la memoria principal) o inválidas (en este caso la línea no contiene información útil). Como el caché se llena por líneas completas (comenzando por direcciones múltiplos de 16), hay que tratar de no leer posiciones aleatorias de la memoria, ya que en este caso, si se leen bytes en posiciones alejadas unas de otras, el procesador usará cuatro ciclos de bus para leer 16 bytes (para llenar una línea) por cada byte que deseamos leer. Esto no es problema para el código o la pila (stack) ya que éstos se acceden generalmente de manera secuencial.

Hay dos clases de cachés: write-through y write-back (retroescritura)(implementado solamente en los modelos write-back enhanced DX2 y write-back enhanced DX4). La diferencia entre las dos radica en el momento de escritura. Las primeras siempre escriben en la memoria principal, mientras que las otras sólo escriben cuando se llena el caché y hay que desocupar una línea. Esto último aumenta el rendimiento del sistema.

Hay dos nuevos bits del registro de control CR0 que controlan el funcionamiento del caché: CD (Cache Disable, bit 30) y NW (Not write-through, bit 29).

Cuando CD = 1, el 80486 no leerá memoria externa si hay una copia en el caché, si NW = 1, el 80486 no escribirá en la memoria externa si hay datos en el caché (sólo se escribirá en el caché).

La operatoria normal (caché habilitado) es CD = NW = 0. Nótese que si CD = NW = 1 se puede utilizar el caché como una RAM rápida (no hay ciclos externos de bus ni para lectura ni para escritura)

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

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

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

VI. FORMATO DE DATOS

CODIGO ASCII

El juego de caracteres ASCII (excluyendo los caracteres extendidos definidos por IBM) está dividido en cuatro grupos de 32 caracteres. Los primeros 32 caracteres, del código ASCII 0 hasta el ASCII 1Fh16 (3110) forman un juego especial de caracteres no imprimibles llamados caracteres de control ya que ejecutan varias operaciones de despliegue/impresión en lugar de mostrar símbolos, ejemplo de éstos son el retorno de carro que posiciona el llamado cursor al lado izquierdo de la actual línea de caracteres, avance de línea que mueve hacia abajo el llamado cursor una línea en el dispositivo de salida. Desafortunadamente, los diferentes caracteres de control ejecutan diferentes operaciones dependiendo del dispositivo de salida ya que existe poca estandarización al respecto.

El segundo grupo de caracteres comprende varios símbolos de puntuación, caracteres especiales y dígitos numéricos, los caracteres mas notables de éste grupo son el caracter de espacio (código ASCII 20h) y los dígitos numéricos (códigos ASCII 30h al 39h). Observe que los digitos numéricos difieren de sus respectivos valores sólo en el nibble de alto orden, restando 30h de un código numérico ASCII dado se obtiene el equivalente numérico.

El tercer grupo de caracteres ASCII está reservado a las letras mayúsculas. Los códigos ASCII para los caracteres "A" a la "Z" están en el rango comprendido entre 41h y 5Ah (65 al 90 decimal). Como éstos caracteres están definidos de acuerdo al alfabeto utilizado en el idioma inglés solo hay 26 diferentes caracteres alfabeticos utilizando los seis códigos restantes para varios símbolos especiales.

El cuarto y último grupo de caracteres ASCII está reservado a las letras minúsculas, cinco símbolos especiales adicionales y otro caracter de control (borrar). Los caracteres ASCII para las letras minúsculas utilizan los códigos 61h al 7Ah. Si Usted convierte a binario los códigos correspondientes a las letras mayúsculas y minúsculas observará que los símbolos para las mayúsculas difieren de sus respectivas minúsculas en una posición de bit. Las letras mayúsculas siempre contienen un cero en la posición cinco en tanto que las letras minúsculas contienen un uno en la misma posición, es posible utilizar éste hecho para convertir de mayúsculas a minúsculas y viceversa.

Organización de datos

En términos matemáticos un valor puede tomar un número arbitrario de bits, pero las computadoras por el contrario, generalmente trabajan con un número específico de bits, desde bits sencillos pasando por grupos de cuatro bits (llamados nibbles), grupos de ocho bits (bytes), grupos de 16 bits (words, ó palabras) y aún más. Como veremos mas adelante, existe una buena razón para utilizar éste orden.

Bits

La más pequeña cantidad de información en una computadora binaria es el bit, éste solamente es capaz de representar dos valores diferentes, sin embargo ésto no significa que exista una cantidad muy reducida de elementos representables por un bit, todo lo contrario, la cantidad de elementos que se pueden representar con un sólo bit es infinito, considere ésto, podemos representar por ejemplo, cero ó uno, verdadero ó falso, encendido ó apagado, masculino ó femenino. Más aún, no estamos limitados a representar elementos antagónicos, un bit sencillo puede representar cualesquiera dos valores, por ejemplo, blanco ó 432, perro ó caliente. Y para ir aún más lejos, dos bits adyacentes pueden representar cosas completamente independientes entre sí, lo que se debe tener en cuenta es que un bit sencillo sólo puede representar dos cosas a la vez. Esta característica otorga a las computadoras binarias un campo infinito de aplicaciones.

Nibbles

Un nibble es una colección de cuatro bits, ésto no representaría una estructura interesante si no fuera por dos razones: El Código Binario Decimal (BCD por sus siglas en inglés) y los números hexadecimales. Se requieren cuatro bits para representar un sólo dígito BCD ó hexadecimal. Con un nibble se pueden representar 16 valores diferentes, en el caso de los números hexadecimales, cuyos valores 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, y F son representados con cuatro bits. El BCD utiliza diez dígitos diferentes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) e igualmente se requiere de cuatro bits. De hecho se puede representar 16 elementos diferentes con un sólo nibble pero los dígitos hexadecimales y BCD son los principales representados por un nibble.

Bytes

Todavía se puede decir que el byte es la estructura de datos más importante utilizada por los procesadores 80x86. Un byte está compuesto de ocho bits y es el elemento de dato más pequeño direccionable por un procesador 80x86, ésto significa que la cantidad de datos más pequeña a la que se puede tener acceso en un programa es un valor de ocho bits. Los bits en un byte se enumeran del cero al siete de izquierda a derecha, el bit 0 es el bit de bajo orden ó el bit menos significativo mientras que el bit 7 es el bit de alto orden ó el bit más significativo. Nos referimos al resto de los bits por su número. Observe que un byte está compuesto de dos nibbles.

Como un byte contiene ocho bits, es posible representar 28, ó 256 valores diferentes. Generalmente utilizamos un byte para representar valores numéricos en el rango de 0 ~ 255, números con signo en el rango de -128 ~ +127, códigos de caracter ASCII y otros tipos de datos especiales que no requieran valores diferentes mayores que 256.

Words (palabras)

Una palabra (word) es un grupo de 16 bits enumerados de cero hasta quince, y al igual que el byte, el bit 0 es el bit de bajo orden en tanto que el número quince es el bit de alto orden. Una palabra contiene dos bytes, el de bajo orden que está compuesto por los bits 0 al 7, y el de alto orden en los bits 8 al 15. Naturalmente, una palabra puede descomponerse en cuatro nibbles. Con 16 bits es posible representar 216 (65,536) valores diferentes, éstos podrían ser el rengo comprendido entre 0 y 65,535, ó como suele ser el caso, de -32,768 hasta +32,767. También puede ser cualquier tipo de datos no superior a 65,536 valores diferentes

Campos de bits y paquetes de datos

Aunque los procesadores 80x86 trabajan con mayor eficacia con tipos de datos como el byte, la palabra, ó la palabra doble, ocasionalmente Usted necesitará trabajar con un tipo de dato que utilize cierto número de bits diferente de ocho, 16 ó 32. por ejemplo, considere una fecha de la forma "4/2/88". Éste toma tres valores numéricos para representar la fecha, para el mes, el día y el año. Los meses, por supuesto, toman valores entre 1 y 12, ésto requiere al menos cuatro bits. Los días tienen un rango de entre 1 y 31 así que se requieren cinco bits para representar el valor del día, en tanto que para el año, asumiendo que trabajamos con sólo dos dígitos en el rango de 0 a 99, entonces requerimos siete bits, en total se necesitan 16 bits para representar la fecha, o sea, dos bytes. En otras palabras, empaquetamos la representaciñon de la fecha en dos bytes en lugar de utilizar tres bytes que son los que hubieran sido necesarios para manejar los datos separadamente, ésto ahorra un byte de memoria para cada fecha almacenada. Los bits se pueden ordenar de la siguiente manera:

MMMM representan los cuatro bits para el valor del mes, DDDDD son cinco bits para representar el valor del día, y AAAAAAA son los siete bits para representar el valor del año. Cada colección de bits representando un elemento de la fecha se llama campo de bits. Aunque los valores empaquetados son eficientes en materia de ahorro de memoria, éstos son a la vez ineficientes computacionalmente hablando. la razón de ésto es porque se requieren instrucciones adicionales para leer los diferentes elementos del paquete de datos, éstas instrucciones adicionales se traducen en mayor tiempo de ejecución del programa, se debe ser cuidadoso al utilizar paquetes de datos

VII. LENGUAJE MAQUINA

Lenguaje de máquina es el sistema de códigos directamente interpretable por una máquina, como el procesador de un ordenador. Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones a ser tomadas por la máquina.

Un programa de computadora consiste de una cadena de estas instrucciones de lenguaje de máquina (más datos). Estas instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el proprio programa o eventos externos.

El lenguaje de máquina es específico de cada máquina o arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre ellas. El lenguaje máquina sólo utiliza dos signos. Y éstos se corresponden exactamente con las únicas dos constantes del álgebra booleana, y también con los dos estados exclusivos de un conmutador. Estos signos, constantes o estados de conmutación son el 1 y el 0, llamados dígitos binarios.

Claude Elwood Shannon, en su Analysis of Relay and Switching Circuits, y con sus experiencias en redes de conmutación sentó las bases para la aplicación del álgebra de Boole a redes de conmutación.

Una Red de Conmutación es un circuito de interruptores eléctricos que al cumplir ciertas combinaciones booleanas con las variables de entrada, define el estado de la Salida. Este concepto es el núcleo de las Compuertas Lógicas, las cuales son por su parte, los ladrillos con que se construyen sistemas lógicos cada vez más complejos Shannon utilizaba al relay como dispositivo físico de conmutación en sus redes. El relay, igual que el interruptor de una lámpara eléctrica, es 1 o es 0; está prendido o está apagado El desarrollo tecnológico ha permitido evolucionar desde las redes de relays electromagnéticos de Shannon, pasar a circuitos con Tubos de Vacío, luego a redes transistorizadas, hasta llegar a los modernos Circuitos Integrados.

El Microprocesador de la CPU del ordenador opera en lenguaje máquina, ya que su repertorio de instrucciones consiste en la ejecución de conjuntos binarios. Por cierto que Shannon fue quien aportó el término Bit para los guarismos 1 y 0, abreviatura inglesa de binary digits o "dígitos binarios").

Microcodigo

Instrucciones del más bajo nivel que controlan directamente a un microprocesador. Una sóla instrucción en lenguaje de máquina normalmente se traduce en varias instrucciones de microcódigo.

Código de instrucción

La organización interna de un sistema digital está definida por la secuencia de microoperaciones que ejecuta sobre los datos almacenados en sus registros.

La computadora digital de propósito general puede ejecutar varias microoperaciones y, además, puede recibir instrucciones acerca de la secuencia específica de operaciones que debe realizar.

El usuario de una computadora puede controlar el proceso mediante un programa. Un programa es un conjunto de instrucciones que especifican las operaciones, operandos y la secuencia mediante la cual tiene que ocurrir el procesamiento.

La tarea de procesamiento de datos puede alterarse al especificar un nuevo programa con instrucciones diferentes o especificando las mismas instrucciones con otros datos.

Una instrucción de computadora es un código binario que especifica una secuencia de microoperaciones para la computadora.

Los códigos de instrucciones y los datos se almacenan en la memoria. La computadora lee cada instrucción de la memoria y la coloca en un registro de control. Entonces el control interpreta el código binario de la instrucción y procede a ejecutarlo mediante una secuencia de microoperaciones. Cada computadora tiene un conjunto de instrucciones único. La capacidad de almacenar y ejecutar instrucciones, el concepto de programa almacenado, es la propiedad más importante de una computadora de uso general.

Un código de instrucción es un grupo de bits que instruye a la computadora sobre cómo ejecutar una operación específica. Por lo general, se divide en partes y cada una tiene una interpretación propia. La parte más básica de un código de instrucción es su parte de operación.

El código de operación de una instrucción es un grupo de bits que define operaciones como sumar, restar, multiplicar, desplazar y complementar. El número de bits requerido para el código de operación de una instrucción depende de la cantidad total de operaciones disponibles en la computadora. El código de operación debe estar formado de por lo menos n bits para un conjunto dado de 2n (o menor) operaciones diferentes.

Como ejemplo, consideremos una computadora con 64 operaciones diferentes, una de las cuales es la operación sumar (ADD). El código de operación consta de seis bits, con una configuración de bits 110010 asignada a la operación ADD. Cuando este código de operación se decodifica en la unidad de control, la computadora emite señales de control para leer un operando de la memoria y sumar el operando a un registro del procesador. En este punto, debemos reconocer la relación entre una operación de computadora y una microoperación. Una operación es parte de una instrucción almacenada en la memoria de la computadora. Es un código binario que le dice a la computadora que ejecute una operación específica. La unidad de control recibe la instrucción de la memoria e interpreta los bits de código de la operación. Después emite una secuencia de señales de control para iniciar microoperaciones en los registros internos de la computadora. Para cada código de operación, el control envía una secuencia de microoperaciones necesarias para la implantación del hardware de la operación especificada.

Por esta razón, a veces un código de operación se denomina macrooperación, porque especifica un conjunto de microoperaciones. La parte operativa de un código de instrucción especifica la operación que se va a realizar. Esta operación debe ejecutarse sobre algunos datos almacenados en los registros del procesador o en la memoria. Por lo tanto, un código de instrucción debe especificar no sólo la operación, sino también los registros o las palabras de la memoria donde se van a encontrar los operandos, al igual que el registro o la palabra de memoria donde se va a almacenar el resultado. Pueden especificarse palabras de memoria en los códigos de instrucción mediante sus direcciones. Pueden especificarse registros del procesador al asignar a la instrucción otro código binario de k bits que especifique uno de 2 registros.

Existen muchas variaciones para "componer" el código binario de instrucciones, y cada computadora tiene su propio formato de código de instrucciones particular. Los diseñadores de computadoras formulan los formatos de código de instrucciones y especifican la arquitectura de la computadora.

VIII. 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):

IX. DESCRIPCION DEL FUNCIONAMIENTO DE LAS INSTRUCCIONES

INTERRUPCIONES

INT (interrupción)

Sintaxis: INT n (0 <= n <= 255)

Indicadores: OF DF IF TF SF ZF AF PF CF

-- -- 00 00 -- -- -- -- -

Inicializa un procedimiento de interrupción de un tipo indicado en la instrucción. En la pila se introduce al llamar a una interrupción la dirección de retorno formada por los registros CS e IP y el estado de los indicadores. INT 3 es un caso especial de INT, al ensamblarla el ensamblador genera un sólo byte en vez de los dos habituales; esta interrupción se utiliza para poner puntos de ruptura en los programas. Ejemplo: int 21h

INTO (interrupción por desbordamiento)

Sintaxis: INTO

Indicadores: OF DF IF TF SF ZF AF PF CF

-- -- 00 00 -- -- -- -- --

Genera una interrupción de tipo 4 (INT 4) si existe desbordamiento (OF=1). De lo contrario se continúa con la instrucción siguiente.

IRET (retorno de interrupción)

Sintaxis: IRET

Indicadores: OF DF IF TF SF ZF AF PF CF

xx xx xx xx xx xx xx xx x

Devuelve el control a la dirección de retorno salvada en la pila por una interrupción previa y restaura los indicadores que también se introdujeron en la pila. En total, se sacan las 3 palabras que fueron colocadas en la pila cuando se produjo la interrupción. Véase también INT.

BIBLIOGRAFIA

Las siguientes son las paginas web de donde fue tomada la información:

http://atc.ugr.es/docencia/udigital/03.html

http://www.alpertron.com.ar/80486.HTM

http://www.dialway.com/biblio/tablas/accii.htm

CONCLUSION

En conclusiòn 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.