Make your own free website on Tripod.com

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

El MCS 86/88 tiene disponible un total de 256 interrupciones vectorizadas.

Cada vez que se reconoce una interrupción se pasa el control del programa a la dirección especificada por el vector de interrupción. Esta dirección ocupa 4 Bytes; los 2 primeros almacenan CS y los 2 Bytes restantes IP.

La tabla de interrupciones puede ocupar hasta 1 Kbytes ( 256 Bytes * 4 )

La 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 memoria

00

02

04

06

08

0A

0C

0E

10

12

....

3FC

3FE

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

Referencias Bibliograficas

Dario Alejandro Alpern (2004). Los microprocesadores 8086 y 8088.  [Documento en línea]. Disponible: http://www.alpertron.com.ar/8088.HTM [Consultada: 2005, Noviembre 30]