Alterar la interrupción en modo real de 16 bits
Pregunta
Estoy intentando alterar mi tabla de interrupciones para controlar la interrupción del teclado. Mi objetivo final es escribir mi nueva rutina de interrupción, copiarme en la RAM y hacer que la tabla de interrupciones en modo real apunte hacia mí.
He encontrado código de muestra al azar en línea, pero Faltan explicaciones sobre cómo obtener la dirección de la interrupción original. Simplemente tienen variables en su lugar y cómo ubicarse en la memoria.
Entonces, mi pregunta es ¿cómo averiguo o imprimo en mi pantalla la tabla de interrupciones en modo real?
Y / O si alguien tiene buenos ejemplos de código para hacer esto, ya sea para deshabilitar ciertas teclas o emitir un pitido en ciertas teclas, realmente lo apreciaría.
¡Gracias!
Solución
En el modo real de 16 bits, la tabla de interrupciones comienza en la dirección 0, con 256 entradas de 4 bytes. Cada uno de los 256 vectores de interrupción obtiene una dirección de 4 bytes (segmento + desplazamiento) en esa tabla.
http://en.wikipedia.org/wiki/Interrupt_descriptor_table tiene más detalles .
Otros consejos
Si su programa se ejecuta en DOS, puede (y probablemente debería) usar la API proporcionada por DOS:
MOV AH,35H ; function 35H is Get Vector
MOV Al,9 ; slot in IDT for keyboard interrupt
INT 21H ; call DOS, contents of old vector in ES:BX (save them somewhere)
.
.
MOV AH,25H ; function 25H is Set Vector
MOV AL,9
PUSH CS ; the new vector is passed in DS:DX, so copy CS to DS
POP DS : (assuming your new handler is in the same seg as other code)
MOV DX,NewHandler
INT 21H