Interruption 21h |
Fonction 35h |
Demande de l'adresse d'un interruption |
---|---|---|
DOS 2.0+, OS/2, Windows NT |
Description
Cette fonction permet de demander l'adresse d'un vecteur d'interruption.
Entrée
Registre | Valeur ou description |
---|---|
AH | 35h |
AL | Ce registre permet d'indiquer le numéro d'interruption |
Sortie
Registre | Valeur ou description |
---|---|
ES:BX | Cette paire de registres permet d'indiquer l'adresse du vecteur d'interruption |
Remarques
- Voici un exemple en écrit en Turbo Pascal 6 de l'apparence de cette fonction :
- Les vecteurs d'interruptions sont situés dans les 1024 premiers octets de la mémoire conventionnel. Ils occupent chacun 4 octets et sont 256. Ainsi, on peut facilement comprendre que 256 x 4 = 1024 octets. Les deux octets de poids faible indiquent le déplacement et les deux octets de poids fort indiquent le segment d'appel de l'interruption. Le comportement s'apparente à un «PUSHF», un «CALL FAR» et une désactivation des interruptions masquables (IRQ) (CLI) mais il utilise l'instruction «INT».
- Une utilisation hasardeuse ou irréfléchie peut facilement faire planter le système d'exploitation, le programme ou provoquer se genre d'erreur sous Windows XP «NTVDM CPU has encountered an illegal instruction.». Aussi, il pourrait se produire un effet de cascade provoquant un plantage quelques minutes plus tard. Il est important de préservé autant que possible les registres afin de ne pas affecter le programme appelant l'interruption.
- Associée à l'interruption 21h, fonction 25h (Set Interrupt Vector), cette fonction est utilisée par des programmes d'application de bonne conformité pour modifier ou inspecter la table des vecteurs d'interruption de la machine.
Exemple
Voici quelques exemples typiques de l'utilisation de «GetIntVec» en Turbo Pascal 7 permettant de détecter le pilote de souris :
- Program GetIntVecSamples;
-
- Uses Dos;
-
- Var Int33h:^Byte;
-
- BEGIN
- ASM
- MOV AX,3533h
- INT 21h
- MOV Word Ptr Int33h[0],BX
- MOV Word Ptr Int33h[2],ES
- END;
- If Int33h = NIL Then WriteLn('Aucun pilote de pilote de souris est installé !')
- Else
- If Int33h^ = $CF Then WriteLn('Le pilote est vide !')
- Else
- Begin
- WriteLn('Le pilote de souris est installé.');
- End;
- END.
on obtiendra le résultat suivant s'il y a un pilote de souris d'installé :
Le pilote de souris est installé.Code source
Voici des exemples du code source d'utilitaires reliés sur GitHub :
Lien | Langage de programmation | Projet | Description |
---|---|---|---|
https://github.com/gladir/corail/blob/master/DIVT.PAS | Turbo Pascal | Corail | Affiche les adresses de toutes les interruptions |
Voir également
Langage de programmation - Turbo Pascal - Référence de procédures et fonctions - GETINTVEC
Langage de programmation - Assembleur et Pascal - Affichage - Programme émulant le BIOS CGA pour les Graphic Solutions
Interruption 21h, Fonction 25h: Fixer l'adresse d'un vecteur d'interruption
Références
La Bible du PC: Programmation système - Sixième Edition, Edition Micro-Application, Michael Tischer, 1996, ISBN: 2-7429-0544-8, page 1518.
Aide-mémoire des interruptions du MS-DOS, Edition Marabout, Philippe Mercier, 1990, ISBN: 2-501-01297-6, page 194 à 195.