Section courante

A propos

Section administrative du site

SETINTVEC

Fixe le vecteur d'interruption
Turbo Pascal 4+ DOS

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

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 :

  1. Program SetIntVectSamples;
  2.  
  3. Uses DOS;
  4.  
  5. Const
  6.  MaChaine:String = 'Bonjour, Ceci est un test';
  7.  
  8. Var
  9.  OldInt90h:Pointer;
  10.  MyResult:Word;
  11.  
  12. Procedure Int90h(_Flags,_CS,_IP,_AX,_BX,_CX,_DX,_SI,_DI,_DS,_ES,_BP:Word);Interrupt;
  13. Var
  14.  I:Byte;
  15.  Result:Byte;
  16. Begin
  17.  Result := 0;
  18.  For I := 1 to Mem[_ES:_DI]do Begin
  19.   If(Mem[_ES:_DI+I] = Lo(_BX))Then Inc(Result);
  20.  End;
  21.  _AX := Result;
  22. End;
  23.  
  24. BEGIN
  25.  GetIntVec($90,OldInt90h);
  26.  SetIntVec($90,@Int90h);
  27.  ASM
  28.   MOV BL,'e';
  29.   PUSH DS
  30.   POP ES
  31.   MOV DI,Offset MaChaine;
  32.   INT $90;
  33.   MOV MyResult,AX
  34.  END;
  35.  SetIntVec($90,OldInt90h);
  36.  WriteLn('Nombre de "e" dans la chaine "',MaChaine,'"=',MyResult);
  37. END.

on obtiendra le résultat suivant :

Nombre de "e" dans la chaine "Bonjour, Ceci est un test"=3

Voici le même exemple avec l'interruption 90h écrit en assembleur pour le Turbo Pascal :

  1. Program SetIntVectSamples2;
  2.  
  3. Uses DOS;
  4.  
  5. Const
  6.  MaChaine:String = 'Bonjour, Ceci est un test';
  7.  
  8. Var
  9.  OldInt90h:Pointer;
  10.  MyResult:Word;
  11.  
  12. Procedure Int90h(_Flash,_CS,_IP,_AX,_BX,_CX,_DX,_SI,_DI,_DS,_ES,_BP:Word);Interrupt;Assembler;ASM
  13.   { Depile }
  14.  MOV AX,_ES
  15.  MOV ES,AX
  16.  MOV DI,_DI
  17.  MOV BX,_BX
  18.   { Traitement}
  19.  MOV CL,Byte Ptr ES:[DI]
  20.  XOR CH,CH
  21.  XOR DX,DX
  22. @1:
  23.  INC DI
  24.  CMP Byte Ptr ES:[DI],BL
  25.  JNE @2
  26.  INC DX
  27. @2:
  28.  LOOP @1
  29.  XCHG AX,DX
  30.   { Copie le r‚sultat dans la variable }
  31.  MOV _AX,AX
  32. END;
  33.  
  34. BEGIN
  35.  GetIntVec($90,OldInt90h);
  36.  SetIntVec($90,@Int90h);
  37.  ASM
  38.   MOV BL,'e';
  39.   PUSH DS
  40.   POP ES
  41.   MOV DI,Offset MaChaine;
  42.   INT $90;
  43.   MOV MyResult,AX
  44.  END;
  45.  SetIntVec($90,OldInt90h);
  46.  WriteLn('Nombre de "e" dans la chaine "',MaChaine,'"=',MyResult);
  47. END.

on obtiendra le résultat suivant :

Nombre de "e" dans la chaine "Bonjour, Ceci est un test"=3

Voir é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.

Dernière mise à jour : Dimanche, le 8 février 2015