Une interruption est un mécanisme qui interrompt le processeur
de son travail, pour l'obliger à se brancher sur un sous-programme
appelé par le gestionnaire d'interruption. Concrètrement,
chaque fois que l'on code l'appel d'une fonction DOS (int 21h), on lance
ce gestionnaire qui interprète la commande et lance un sous-programme
de cette fonction.
Disposition de la table
Cette table permet au programme, qui veut par exemple appeler une fonction
DOS (21h), de ne pas avoir à connaître l'emplacement mémoire
des sous-programmes DOS. Il lui suffira de savoir que les fonctions DOS
sont soutenues par l'interruption 21h, pour que le gestionnaire aille voir
dans la table l'adresse correspondant à l'interruption 21h. En fait
le PC peut contenir au maximum 256 interruptions. La table est donc constituée
de 256 éléments. Chaque élément correspond
à l'adresse des fonctions que son interruption soutient. Comme une
adresse se code sur 4 octets (segment:offset), la table est de 256*4 =
1024 octets = 1Ko.
Utilisation de la table
On sait que cette table commence a l'adresse 0000:0000 et qu'elle prend
1Ko, donc elle se termine à l'adresse 000:03FF. De plus il est facile
de calculer l'adresse où se trouve les sous-programmes du DOS. Il
suffit de multiplier 21h (interruption DOS) par 4 (taille d'une adresse)
pour obtenir 0084h (offset dans la table). Il ne reste plus qu'à
lire le double mot se situant à l'adresse 0000:0084h. Attention
les processeurs Intel rangent les octets dans le sens inverse. (Méthode
Little Endian ) C.a.d. que si vous lisez le double mot D4F054ABh dans la
table, l'adresse est en fait AB54:FOD4h
Détournement d'interruption
On apelle détournement d'interruption l'action de remplacer
dans la table une adresse par celle de l'emplacement d'une autre routine.
Exemple: l'interruption 23h est déclenchée dès que
Control break est activé. Il serait fort regrettable que sur une
machine d'exposition où une démo tourne en boucle, que n'importe
qui puisse la stopper par l'appui de Ctrl+C. Dans ce cas, on peut écrire
préalablement une routine qui ne contient que l'instruction 'Iret'
. Dès le début du programme on sauvegarde l'adresse de l'interruption
23h, et on la remplace par celle de notre routine. A la fin, on n'a juste
à replacer l'adresse d'origine et quitter le programme. Lors de
l'exécution, si un Ctrl+C est essayé, le déclenchement
automatique de l'interruption 23h appelera un sous-programme qui ne fait
rien, au lieu de l'action prévue par défaut qui aurait stoppé
voir 'planté' le programme. Pour résumer, le détournement
d'interruption ne fait que remplacer une adresse. On peut envisager une
autre possibilité: Ex: On veut avoir un traitement spécial
dès l'appui de la touche échappe tout en gardant les réactions
normales du clavier pour les autres touches.
Une solution peut être de détourner l'interruption clavier.
Si la touche n'est pas [Echap], on effectue un 'FAR JUMP' à
l'adresse de l'ancien gestionnaire, sinon on lance notre routine spéciale.
Programmes d'exemples
TableInt.exe qui recopie la table d'interruption dans un fichier
texte DOS en ASCII.
DetCtrlC.exe qui fait défiler un texte en boucle sans
être affecté par Ctrl+C, mais par l'appui de la touche échappe.