Interrupciones

Anuncio
Assembler ¡  Una interrupción es muy similar a una llamada a subru0na: implica la suspensión del programa en ejecución y la bifurcación hacia una ru0na especial de atención a la interrupción ¡  Existen dos 0pos principales §  Interrupciones por hardware §  Interrupciones por so?ware ¡ 
Se dan en respuesta a eventos de hardware (ej. el usuario presiona una tecla) ¡ 
Cuando se produce una interrupción por hardware, el procesador interrumpe inmediatamente el programa en ejecución y ejecuta la subru0na de atención a la interrupción o ISR (Interrupt Service Rou/ne) ¡ 
El programa interrumpido con0nuará luego de que termine la ISR sin enterarse de que algo haya pasado ya que: §  Antes de invocar a la ISR, el procesador salva el registro de flags y la dirección del IP en la pila. §  Las ISR resguardan los valores de todos los registros §  Al terminar, la ISR restaura el valor de los registros guardados y ejecuta la instrucción IRET que restaura el IP y el registro de flags. ¡ 
La CPU posee una serie de entradas llamadas líneas de solicitud de interrupción (IRQs). ¡ 
Cada disposi0vo de hardware que necesita actualizarse regularmente está asociado a un IRQ en par0cular. (Ej. el teclado usa el IRQ1). ¡ 
Cuando el disposi0vo provoca un evento, envía una señal a la CPU usando la línea de IRQ asociada. ¡ 
Entonces, la CPU de0ene lo que está haciendo y pasa el control a la ISR. ¡ 
Cuando se presiona una tecla en el teclado, se envía una señal por el IRQ1 ¡ 
La CPU de0ene el procesamiento y ejecuta la ISR asociada al IRQ1. ¡ 
La ISR chequea el estado del teclado y almacena el código de la tecla presionada en un buffer. ¡ 
Finalmente, se ejecuta la instrucción IRET para volver a la ejecución normal. ¡ 
Ahora, cuando el programa necesite leer del teclado, en realidad no se lee el estado del teclado sino que se lee el buffer. ¡  ¿Por qué hacer esto y no leer simplemente el estado del teclado cuando se lo necesite? ¡  Porque se perderían muchísimos caracteres. Imaginar un procesador de textos que funciona lento. ¡  Al u0lizar el mecanismo de interrupciones, el teclado se lee en forma independiente del procesamiento del programa. ¡ 
Las interrupciones por so?ware son, en realidad, un conjunto de subru0nas especiales. ¡ 
Estas subru0nas pueden estar almacenadas en el BIOS o ser parte del sistema opera0vo. ¡ 
La diferencia entre invocar una subru0na e invocar una interrupción por so?ware es la instrucción a u0lizar. ¡ 
Para las interrupciones por so?ware se u0liza la instrucción INT. ¡ 
El sistema opera0vo DOS (o lo que queda de él en Windows, hoy en día) u0liza la INT 21h para permi0r acceder a varios servicios. ¡ 
Según qué función queramos u0lizar, deberemos establecer un código función en AH y quizá parámetros en otros registros. ¡ 
¿Se acuerdan de esto? MOV AX, 4C00h INT 21h ¡  Operación: §  Leer un único carácter del teclado y mostrarlo en pantalla ¡  Parámetros: §  AH = 01h ¡  Devuelve: §  AL = código ASCII del carácter leído ¡  Operación §  Mostrar un único carácter en pantalla ¡  Parámetros: §  AH = 02h §  DL = código ASCII del carácter a mostrar ¡  Operación §  Mostrar un string en pantalla ¡  Parámetros §  AH = 09h §  DX = dirección del string a mostrar §  El string debe estar terminado por el carácter “$” string db "Hola$" ... mov ah, 09h mov dx, offset string int 21h Muestra en pantalla «Hola» ¡ 
Operación: §  Leer un string desde teclado y almacenarlo en memoria ¡ 
Parámetros: §  AH = 0Ah §  DX = dirección de memoria donde almacenar el string leído §  El buffer de memoria debe tener el siguiente formato: ▪  Offset 0: Can0dad máxima de caracteres a leer (incluido el “enter”). ▪  Offset 1: Lugar para almacenar el número de caracteres leídos. ▪  Offset 2: A par0r de este byte se almacenará el string, debe haber espacio suficiente como para almacenar un string de la longitud indicada en el offset 0. Lee hasta 5 caracteres (incluido el Enter) 5 bytes reservados donde se almacenará el string leído buffer db 5, 0, 5 dup (0) En este lugar almacena el ... número de caracteres leídos mov ah, 0Ah (debe ser <= 5) mov dx, offset buffer int 21h 
Descargar