SETINTVEC |
Fixe le vecteur d'interruption |
---|---|
Turbo Pascal 4+ | DOS, WinDos |
Syntaxe
Procedure SetIntVec(Numero:Byte;Adresse:Pointer); |
Paramètres
Nom | Description |
---|---|
Numero | Ce paramètre permet d'indiquer le numéro du vecteur d'interruption à connaitre |
Adresse | Ce paramètre permet d'indiquer l'adresse du vecteur d'interruption |
Description
Cette procédure permet de fixer l'adresse d'un vecteur d'interruption.
Remarques
- 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 l'offset 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 une 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.
Exemples
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 SetIntVectSamples;
-
- Uses DOS;
-
- Const
- MaChaine:String = 'Bonjour, Ceci est un test';
-
- Var
- OldInt90h:Pointer;
- MyResult:Word;
-
- Procedure Int90h(_Flags,_CS,_IP,_AX,_BX,_CX,_DX,_SI,_DI,_DS,_ES,_BP:Word);Interrupt;
- Var
- I:Byte;
- Result:Byte;
- Begin
- Result := 0;
- For I := 1 to Mem[_ES:_DI]do Begin
- If(Mem[_ES:_DI+I] = Lo(_BX))Then Inc(Result);
- End;
- _AX := Result;
- End;
-
- BEGIN
- GetIntVec($90,OldInt90h);
- SetIntVec($90,@Int90h);
- ASM
- MOV BL,'e';
- PUSH DS
- POP ES
- MOV DI,Offset MaChaine;
- INT $90;
- MOV MyResult,AX
- END;
- SetIntVec($90,OldInt90h);
- 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"=3Voici le même exemple avec l'interruption 90h écrit en assembleur pour le Turbo Pascal :
- Program SetIntVectSamples2;
-
- Uses DOS;
-
- 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
- GetIntVec($90,OldInt90h);
- SetIntVec($90,@Int90h);
- ASM
- MOV BL,'e';
- PUSH DS
- POP ES
- MOV DI,Offset MaChaine;
- INT $90;
- MOV MyResult,AX
- END;
- SetIntVec($90,OldInt90h);
- 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
Liste des interruptions
Langage de programmation - Turbo Pascal - Référence de procédures et fonctions - GETINTVEC
Programme émulant le BIOS CGA pour les cartes Graphic Solutions
Interruption 21h, Fonction 35h: Demande l'adresse d'un vecteur d'interruption
Interruption 21h, Fonction 25h: Fixer l'adresse d'un vecteur d'interruption
Référence
Aide-mémoire de Turbo Pascal versions de 3 à 6, Edition Marabout, De Groote, Virga, 1992, ISBN: 2-501-01833-8, page 393.