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