Alter Interrupt en mode réel 16 bits
Question
J'essaie de modifier ma table d'interruptions pour prendre en charge l'interruption du clavier. Mon objectif final est d’écrire ma nouvelle routine d’interruption, de me copier dans la RAM et de faire pointer la table d’interruptions en mode réel.
J'ai trouvé un exemple de code en ligne aléatoire, mais en ligne. Il manque des explications sur la façon d'obtenir l'adresse de l'interruption d'origine. Ils ont simplement des variables à leur place et comment se mettre en mémoire.
Ma question est donc la suivante: comment puis-je comprendre ou imprimer sur mon écran la table d’interruption en mode réel?
Et / OU si quelqu'un a de bons exemples de code permettant de désactiver certaines touches ou d'émettre un bip sur certaines touches, je l'apprécierais vraiment.
Merci!
La solution
En mode réel 16 bits, la table d’interruptions commence à l’adresse 0, avec 256 entrées sur 4 octets. Chacun des 256 vecteurs d’interruption reçoit une adresse de 4 octets (segment + offset) dans cette table.
http://en.wikipedia.org/wiki/Interrupt_descriptor_table a quelques détails supplémentaires .
Autres conseils
Si votre programme s'exécute sous DOS, vous pouvez (et devriez probablement) utiliser l'API fournie par 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