La Table Des Vecteurs d'Interruptions

 
Petite définition des interruptions
 
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.