Ändern Sie Interrupt in 16-Bit-Real-Modus
Frage
Ich versuche, meine Interrupt-Tabelle zu ändern über die Tastatur-Interrupt zu nehmen. Mein Endziel ist meine neue Interrupt-Routine zu schreiben, mich in dem RAM kopieren und den Real-Modus-Interrupt-Tabelle Punkt für mich.
Ich habe zufällig Beispielcode rel="nofollow online, aber es fehlen Erklärungen, wie die Adresse des ursprünglichen Interrupt zu bekommen. Sie haben einfach Variablen an ihrem Platz, und wie es sich setzen in den Speicher.
Also meine Frage ist, wie kann ich herausfinden, oder auf meinen Bildschirm Interrupttabelle die Real-Modus drucken?
und / oder wenn jemand irgendwelche guten Code-Beispiele, dies zu tun, um entweder deaktivieren bestimmte Tasten oder akustisches Signal auf bestimmte Tasten habe ich es wirklich schätzen würde.
Danke!
Lösung
In 16-Bit-Real-Modus, beginnt die Interrupt-Tabelle bei Adresse 0, mit 256 4-Byte-Einträgen. Jede der 256 Interruptvektoren erhält eine 4-Byte-Adresse (Segment + Offset) in dieser Tabelle.
http://en.wikipedia.org/wiki/Interrupt_descriptor_table hat etwas mehr Detail .
Andere Tipps
Wenn Ihr Programm unter DOS läuft, können Sie (und wahrscheinlich sollten) verwenden, um den DOS-API zur Verfügung gestellt:
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