• No se han encontrado resultados

7.1 LAS INTERRUPCIONES

In document El Universo Digital Ibm Pc at y Ps2 (página 112-114)

Capítulo VII: ARQUITECTURA DEL PC, AT Y PS/2 BAJO DOS

7.1 LAS INTERRUPCIONES

Son señales enviadas a la CPU para que termine la ejecución de la instrucción en curso y atienda una petición determinada, continuando más tarde con lo que estaba haciendo.

Cada interrupción lleva asociado un número que identifica el tipo de servicio a realizar. A partir de dicho número se calcula la dirección de la rutina que lo atiende y cuando se retorna se continúa con la instrucción siguiente a la que se estaba ejecutando cuando se produjo la interrupción. La forma de calcular la dirección de la rutina es multiplicar por cuatro el valor de la interrupción para obtener un desplazamiento y, sobre el segmento 0, con dicho desplazamiento, se leen dos palabras: la primera es el desplazamiento y la segunda el segmento de la rutina deseada. Por tanto, en el primer kilobyte de memoria física del sistema, existe espacio suficiente para los 256 vectores de interrupción disponibles.

Hay tres tipos básicos de interrupciones:

- Interrupciones internas o excepciones: Las genera la propia CPU cuando se produce una situación anormal

o cuando llega el caso. Por desgracia, IBM se saltó olímpicamente la especificación de Intel que reserva las interrupciones 0-31 para el procesador.

„ INT 0: error de división, generada automáticamente cuando el cociente no cabe en el registro o el divisor es cero. Sólo puede ser generada mediante DIV o IDIV. Hay una sutil diferencia de comportamiento ante esta interrupción según el tipo de procesador: el 8088/8086 y los NEC V20 y V30 almacenan en la pila, como cabría esperar, la dirección de la instrucción que sigue a la que causó la excepción. Sin embargo, el 286 y superiores almacenan la dirección del DIV o IDIV que causa la excepción.

„ INT 1: paso a paso, se produce tras cada instrucción cuando el procesador está en modo traza (utilizada en depuración de programas).

„ INT 2: interrupción no enmascarable, tiene prioridad absoluta y se produce incluso aunque estén inhibidas las interrupciones (con CLI) para indicar un hecho muy urgente (fallo en la alimentación o error de paridad en la memoria).

„ INT 3: utilizada para poner puntos de ruptura en la depuración de programas, debido a que es una instrucción de un solo byte muy cómoda de utilizar.

„ INT 4: desbordamiento, se dispara cuando se ejecuta un INTO y había desbordamiento.

„ INT 5: rango excedido en la instrucción BOUND (sólo 286 y superiores). Ha sido incorrectamente empleada por IBM para volcar la pantalla por impresora.

„ INT 6: código de operación inválido (sólo a partir del 286). Se produce al ejecutar una instrucción indefinida, en la pila se almacena el CS:IP de la instrucción ilegal.

- Interrupciones hardware: Son las generadas por la circuitería del ordenador en respuesta a algún evento. Las

más importantes son:

„ INT 8: Se produce con una frecuencia periódica determinada por el canal 0 del chip temporizador 8253/8254 (en la práctica, unas 18,2 veces por segundo). Como desde esta interrupción se invoca a su vez a INT 1Ch -porque así lo dispuso IBM-, es posible ligar un proceso a INT 1Ch para que se ejecute periódicamente.

„ INT 9: generada al pulsar o soltar una tecla.

„ INT 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh: Puertos serie, impresora y controladores de disquete.

„ INT 70h, 71h, 72h, 73h, 74h, 75h, 76h, 77h: Generadas en los AT y máquinas superiores por el segundo chip controlador de interrupciones.

- Interrupciones software: Producidas por el propio programa (instrucción INT) para invocar ciertas

subrutinas. La BIOS y el DOS utilizan algunas interrupciones a las que se puede llamar con determinados valores en los registros para que realicen ciertos servicios. También existe alguna que otra interrupción que se limita simplemente a apuntar a modo de puntero a una tabla de datos.

Los vectores de interrupción pueden ser desviados hacia un programa propio que, además, podría quedar residente en memoria. Si se reprograma por completo una interrupción y ésta es de tipo hardware, hay que realizar una serie de tareas adicionales, como enviar una señal fin de interrupción hardware al chip controlador de interrupciones. Si se trata además de la interrupción del teclado del PC o XT, hay que enviar una señal de reconocimiento al mismo ... en resumen: conviene documentarse debidamente antes de intentar hacer nada. Todos estos problemas se evitan si la nueva rutina que controla la interrupción llama al principio (o al final) al anterior gestor de la misma, que es lo más normal, como se verá más adelante.

Para cambiar un vector de interrupción existen cuatro métodos:

1) «El elegante»: es además el más cómodo y compatible. De hecho, algunos programas de DOS funcionan también bajo OS/2 si han sido diseñados con esta técnica. Basta con llamar al servicio 25h del DOS (INT 21h) y decirle qué interrupción hay que desviar y a dónde:

MOV AH,25h ; servicio para cambiar vector

MOV AL,vector ; entre 0 y 255

LEA DX,rutina ; DS:DX nueva rutina de gestión

INT 21h ; llamar al DOS

2) El «psé»: es menos seguro y compatible (ningún programa que emplea esta técnica corre en OS/2) y consiste en hacer casi lo que hace el DOS pero sin llamarle. Es además mucho más incómodo y largo, pero muy usado por programadores despistados:

MOV BL,vector*4 ; vector a cambiar en BL

MOV BH,0 ; ahora en BX

MOV AX,0

PUSH DS ; preservar DS

MOV DS,AX ; apuntar al segmento 0000

LEA DX,rutina ; CS:DX nueva rutina de gestión

CLI ; evitar posible interrupción

MOV [BX],DX ; cambiar vector (offset)

MOV [BX+2],CS ; cambiar vector (segmento)

STI ; permitir interrupciones

POP DS ; restaurar DS

segmento y offset con un REP MOVS) con objeto de evitar una posible interrupción no enmascarable que se pueda producir en ese momento crítico en que ya se ha cambiado el offset pero todavía no el segmento (CLI no inhibe la interrupción no enmascarable). Este sistema es todavía algo más engorroso, pero es el mejor y es el que utiliza el DOS en el método (1).

4) El «método incorrecto» es muy usado por los malos programadores. Es similar al «psé» sólo que sin inhibir las interrupciones mientras se cambia el vector, con el riesgo de que se produzca una interrupción cuando se ha cambiado sólo medio vector. Los peores programadores lo emplean sobre todo para cambiar INT 8 ó INT 1Ch, que se producen con una cadencia de 18,2 veces por segundo.

In document El Universo Digital Ibm Pc at y Ps2 (página 112-114)