Interruption 21h |
Fonction 25h |
Fixer l'adresse d'un vecteur d'interruption |
---|---|---|
CP/M, DOS 1.0+, OS/2, Windows NT |
Description
Cette fonction permet de fixer l'adresse d'un vecteur d'interruption.
Entrée
Registre | Valeur ou description |
---|---|
AH | 25h |
AL | Ce registre permet d'indiquer le numéro d'interruption |
DS:DX | Cette paire de registres permet d'indiquer l'adresse du pointeur sur la nouvelle interruption |
Sortie
Aucune
Remarques
- Cette fonction doit être utilisée de préférence à l'édition directe de la table des vecteurs d'interruption afin les applications se comporte de façon conforme et normal.
- Avant de modifier un vecteur d'interruption, sa valeur d'origine doit être obtenue avec l'interruption 21h, fonction 35h et enregistrée, afin de pouvoir être restaurée à l'aide de cette fonction avant la fin du programme.
- Voici un exemple en écrit en Turbo Pascal 6 de l'apparence de cette fonction :
- Procedure SetIntVec(AL:Byte;DS,DX:Word);
- Var
- TableInt:Array[Byte]of Pointer Absolute 0:0;
- Begin
- ASM CLI; END;
- TableInt[AL]:=Ptr(DS,DX);
- ASM STI; END;
- End;
- 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».
Exemple
L'exemple suivant, écrit en Turbo Pascal 7, permet de créer une interruption 90h temporairement pendant l'exécution du programme effectuant un boucle afin de déterminer le nombre de caractère spécifié est présent combien de fois dans la chaine de caractères et libère l'interruption 90h lorsque le programme se termine :
- Program SetIntVectSamples3;
-
- Const
- MaChaine:String = 'Bonjour, Ceci est un test';
-
- Var
- OldInt90h:Pointer;
- MyResult:Word;
-
-
- Procedure Int90h(_Flash,_CS,_IP,_AX,_BX,_CX,_DX,_SI,_DI,_DS,_ES,_BP:Word);Interrupt;Assembler;ASM
- { Depile }
- MOV AX,_ES
- MOV ES,AX
- MOV DI,_DI
- MOV BX,_BX
- { Traitement}
- MOV CL,Byte Ptr ES:[DI]
- XOR CH,CH
- XOR DX,DX
- @1:
- INC DI
- CMP Byte Ptr ES:[DI],BL
- JNE @2
- INC DX
- @2:
- LOOP @1
- XCHG AX,DX
- { Copie le r‚sultat dans la variable }
- MOV _AX,AX
- END;
-
- BEGIN
- ASM
- MOV AX,3590h
- INT 21h
- MOV Word Ptr OldInt90h[0],BX
- MOV Word Ptr OldInt90h[2],ES
- PUSH DS
- MOV AX,2590h
- MOV DX,OFFSET Int90h
- PUSH CS
- POP DS
- INT 21h
- POP DS
- MOV BL,'e';
- PUSH DS
- POP ES
- MOV DI,Offset MaChaine;
- INT 90h
- MOV MyResult,AX
- PUSH DS
- MOV AX,2590h
- MOV DX,Word Ptr OldInt90h[0]
- MOV DS,Word Ptr OldInt90h[2]
- INT 21h
- POP DS
- END;
- WriteLn('Nombre de "e" dans la chaine "',MaChaine,'"=',MyResult);
- END.
on obtiendra le résultat suivant :
Nombre de "e" dans la chaine "Bonjour, Ceci est un test"=3Voir également
Langage de programmation - Turbo Pascal - Référence de procédures et fonctions - SETINTVEC
Langage de programmation - Assembleur et Pascal - Affichage - Programme émulant le BIOS CGA pour les Graphic Solutions
Interruption 21h, Fonction 35h: Demande 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 1510.
Aide-mémoire des interruptions du MS-DOS, Edition Marabout, Philippe Mercier, 1990, ISBN: 2-501-01297-6, page 173 à 174.