Vector de Interrupciones

Vector de Interrupciones

de Martin Vigliarolo Oyarzabal -
Número de respuestas: 6

Buenas, tengo dudas de cuando hay que hacer la implementacion de la instalación del las instrucciones en el vector de interrupciones cuando trabajamos en Assembler 8086.

En los casos en los que simplemente se nos pide implementar en Assembler cierto problema de interrupciones pero no se nos dan datos sobre la ubicación de la interrupción en el vector de interrupciones, hay que hacer la instalación? En caso afirmativo, que tendríamos que hacer si no tenemos datos?

Saludos

En respuesta a Martin Vigliarolo Oyarzabal

Re: Vector de Interrupciones

de Federico Rivero -

Estimado,

Por defecto en los ejercicios de interrupciones en x86 les pedimos que instalen el vector de interrupciones. Si no se los pedimos va a estar debidamente aclarado, y si no les decimos el ID de la interrupción, pueden usar una constante, pero te diría que siempre lo vamos a indicar.

Otra cosa es en los ejercicios en que solamente pedimos el alto nivel, cuando a lo sumo lo indicamos como un comentario 

// instalar interrupciones.

En alto nivel no hay que hacer más que eso.

Saludos,

        Federico 

En respuesta a Federico Rivero

Re: Vector de Interrupciones

de Martin Vigliarolo Oyarzabal -

Federico, gracias por tu respuesta. 

En mi caso me estoy refiriendo especificamente al ejercicio 2 del practico 10, en el cual no se especifica ningun detalle de donde instalar las interrupciones en el vector de interrupciones, a diferencia de los ejercicios 3 y 4

Saludos

En respuesta a Federico Rivero

Re: Vector de Interrupciones

de Alfonso Dario Medina Carballal -
No me termina de quedar claro este tema
Como se activan las interrupciones ?
Segun su posicion en el vector ?
Gracias
En respuesta a Alfonso Dario Medina Carballal

Re: Vector de Interrupciones

de Belen Brandino -
Hola,

Las interrupciones se activan mediante la flag IF (que podes prender con la instrucción STI). Cuando la CPU arranca, las interrupciones están deshabilitadas, por lo que deberías habilitarlas con esta instrucción, pero antes de habilitarlas es necesario instalar las interrupciones necesarias, utilizando el vector de interrupciones. El vector de interrupciones tiene 256 elementos, que cada uno de estos es una dirección segmentada (es decir 4 bytes: 16 bits de segmento y 16 bits de desplazamiento) donde la dirección indica donde se encuentra la rutina de atención a la interrupción seleccionada. Al darse una interrupción el procesador utilizará la dirección del vector para saltar a la rutina que maneja la interrupción, por lo que si vos no lo instalas, podría saltar a cualquier lugar, ejecutando basura cuando se da la interrupción. Entonces para instalar las interrupciones deberías poner en el vector de interrupciones (segun el indice) la dirección segmentada para la rutina. 

Cada elemento del vector ocupa 4 bytes, donde los primeros 2 son el desplazamiento, y los siguientes 2 son el segmento y se encuentra a partir de la dirección 0 absoluta. Podes verlo en el dibujo de las diapositivas que adjunto.  En el dibujo podes ver como dice Vector 0 (es decir el elemento 0) y la dirección segmentada (desplazamiento y segmento) y así para los 256 elementos. Entonces, para instalar una interrupción deberías primero saber el indice dentro del vector de interrupciones donde lo vas a instalar, imaginate que sea 9 (es algo dado).
Entonces en el elemento 9 vamos a poner nuestra dirección. Como cada elemento ocupa 4 bytes, sabemos que el desplazamiento del elemento 9 se encuentra en 9*4 (el indice es 9 y 4 la cantidad de bytes por elem) y el segmento en 9*4 +2. Imaginate que tenes una interrupción que se llama int1. Con las directivas segment y offset podes obtener el segmento y desplazamiento de tu interrupción int1, haciendo segment int1 y offset int1, que es lo que necesitas poner en el vector de interrupciones

Ahora lo que necesito hacer es, escribir en el vector de interrupciones la direccion segmentada. Como el vector se encuentra a partir de la dirección 0, en la dirección 9*4 escribo el desplazamiento de la rutina y en 9*4+2 el segmento de la rutina.

Entonces tendrías algo asi:
xor ES, ES ; ES = 0 donde arranca el vector 
mov ES:[9*4], offset int1 ; escribo en la posición de memoria 9*4 el desplazamiento correspondiente a la rutina int1
mov ES:[9*4+2], segment int1 ; escribo en la posición de memoria 9*4+2 el segmento correspondiente a la rutina int1
sti ; habilito las interrupciones

...
int1 proc far; esta es tu interrupcion
...

Cualquier cosa si no queda claro preguntá de nuevo

saludos!

Adjunto Screen Shot 2021-11-01 at 13.12.19.png
En respuesta a Belen Brandino

Re: Vector de Interrupciones

de Alfonso Dario Medina Carballal -
gracias por la respuesta Belen
Eso mas o menos lo tenia
Mi duda es como se ejecutan
Esta corriendo el While true y en que momento ocurre la interrupcion ?
Se sincroniza con el timer ?
Como?
En respuesta a Alfonso Dario Medina Carballal

Re: Vector de Interrupciones

de Belen Brandino -
Disculpa, no te entendí bien

Las interrupciones justamente "interrumpen" lo que se esta ejecutando actualmente, y ocurren cuando se da una interrupción por hardware (dispositivos de entrada y salida), software, etc. Las interrupciones se pueden dar en cualquier momento y no dependen de lo que estes ejecutando en tu while true. El timer es también una interrupción, es decir que dentro del vector de interrupciones hay un elemento que tiene la dirección segmentada de donde se encuentra la rutina de atención de la interrupción timer. Esa rutina de atención tiene lo que vos queres que se ejecute cuando el timer interrumpe tu programa

No tengo muy claro cual era tu duda, pero si sigue sin quedar claro pregunta de nuevo