Section courante

A propos

Section administrative du site

Interruption 23h: Touche Break

Cette interruption est appelé par le système d'exploitation à chaque fois que la touche Break est enfoncé. Le vecteur d'interruption de la machine pour l'interruption 23h (emplacements de mémoire 0000:008Ch à 0000:008Fh) contient l'adresse de la routine recevant le contrôle lorsqu'un Ctrl+C est détecté pendant qu'une fonction d'entrée/sortie de caractère et, si le drapeau Break est activé, pendant la plupart des autres appels de fonction du système d'exploitation DOS. L'adresse dans ce vecteur est également copiée dans les emplacements 0Eh à 11h du préfixe de segment de programme (PSP) lorsqu'un programme est chargé mais avant qu'il ne commence à s'exécuter, et est restauré à partir du PSP (au cas où il a été modifié par l'application) en tant que partie de la gestion des terminaisons du système d'exploitation DOS.

Entrée

Pour les DOS version 2.0 ou supérieur :

Drapeau Valeur Description
CF 0 Ce registre à cette valeur fixé lors de son appel.

Sortie

Pour les DOS version 1.? :

Registre Valeur Description
AH 00h Cette valeur permet d'indiquer que le système d'exploitation continue son exécution normalement comme si la touche n'a jamais été enfoncé.
01h à FFh Ces valeurs permettent d'indiquer que le système d'exploitation doit terminé l'exécution du programme.

Pour les DOS version 2.0 ou supérieur:

Drapeau Valeur Description
CF 0 Cette valeur permet d'indiquer que le système d'exploitation continue son exécution normalement comme si la touche n'a jamais été enfoncé.
1 Cette valeur permet d'indiquer que le système d'exploitation doit terminé l'exécution du programme avec un code «ERRORLEVEL=0».

Remarques

Exemples

L'exemple suivant, écrit en Assembleur 8086, permet d'attendre qu'une touche autre que Ctrl+Break soit enfoncé pour terminer, cependant, si la combinaison de touche Ctrl+Break est enfoncé, affiche un message «Ctrl+Break enfoncé» :

  1. .MODEL small
  2.    .STACK 100h
  3.    .DATA
  4. MessageCtrlBreak DB 'Ctrl+Break enfoncé!',13,10,'$'
  5. OldIntr1Bh DD ?
  6. OldIntr23h DD ?
  7.    .CODE
  8. IntBrk:
  9.     MOV  AX,@data
  10.     MOV  DS,AX                  
  11.     MOV  AH,9                   
  12.     MOV  DX,OFFSET MessageCtrlBreak
  13.     INT  21h
  14.     IRET
  15.     .startup   
  16.     MOV  AX,351Bh
  17.     INT  21h
  18.     MOV  Word Ptr OldIntr1Bh[0],BX
  19.     MOV  Word Ptr OldIntr1Bh[2],ES
  20.     MOV  AX,3523h
  21.     INT  21h
  22.     MOV  Word Ptr OldIntr23h[0],BX
  23.     MOV  Word Ptr OldIntr23h[2],ES
  24.     PUSH DS
  25.      MOV  AX,251Bh
  26.      MOV  DX,OFFSET IntBrk
  27.      PUSH CS
  28.      POP  DS
  29.      INT  21h
  30.      MOV  AX,2523h
  31.      MOV  DX,OFFSET IntBrk
  32.      PUSH CS
  33.      POP  DS
  34.      INT  21h
  35.     POP DS
  36.     XOR  AX,AX
  37.     INT  16h
  38.     PUSH DS
  39.      MOV  AX,251Bh
  40.      MOV  DX,Word Ptr OldIntr1Bh[0]
  41.      MOV  DS,Word Ptr OldIntr1Bh[2]
  42.      INT  21h
  43.     POP DS
  44.     PUSH DS
  45.      MOV  AX,2523h
  46.      MOV  DX,Word Ptr OldIntr23h[0]
  47.      MOV  DS,Word Ptr OldIntr23h[2]
  48.      INT  21h
  49.     POP DS
  50.     MOV  AX,4C00h                 
  51.     INT  21h                    
  52.     END

L'exemple suivant, écrit en Assembleur 8086, permet d'attendre qu'une touche autre que Ctrl+Break soit enfoncé pour terminer, cependant, si la combinaison de touche Ctrl+Break est enfoncé, une question «souhaitez vous vraiment fermer le programme (O/N) ?» et si on clique sur la lettre O il quitte le programme si c'est N il recommence a l'étape précédente :

  1. .MODEL small
  2.    .STACK 100h
  3.    .DATA
  4. MessageCtrlBreak DB 'souhaitez vous vraiment fermer le programme (O/N) ?',13,10,'$'
  5. OldIntr1Bh DD ?
  6. OldIntr23h DD ?
  7.    .CODE
  8. BreakOn DB 0
  9. IntBrk:
  10.     MOV  CS:Byte Ptr BreakOn,1
  11.     IRET
  12. BreakCheck:
  13.     MOV  CS:Byte Ptr BreakOn,0
  14.     MOV  AX,@data
  15.     MOV  DS,AX                  
  16.     MOV  AH,09h                   
  17.     MOV  DX,OFFSET MessageCtrlBreak
  18.     INT  21h
  19. ReIntr:
  20.     MOV  AH,08h
  21.     INT  21h
  22.     CMP  AL,'O'
  23.     JE   Fin
  24.     CMP  AL,'o'
  25.     JE   Fin
  26.     CMP  AL,'N'
  27.     JE   Restart
  28.     CMP  AL,'n'
  29.     JE   Restart
  30.     JMP  ReIntr
  31.     .startup   
  32.     MOV  AX,351Bh
  33.     INT  21h
  34.     MOV  Word Ptr OldIntr1Bh[0],BX
  35.     MOV  Word Ptr OldIntr1Bh[2],ES
  36.     MOV  AX,3523h
  37.     INT  21h
  38.     MOV  Word Ptr OldIntr23h[0],BX
  39.     MOV  Word Ptr OldIntr23h[2],ES
  40.     PUSH DS
  41.      MOV  AX,251Bh
  42.      MOV  DX,OFFSET IntBrk
  43.      PUSH CS
  44.      POP  DS
  45.      INT  21h
  46.      MOV  AX,2523h
  47.      MOV  DX,OFFSET IntBrk
  48.      PUSH CS
  49.      POP  DS
  50.      INT  21h
  51.     POP DS
  52. Restart:
  53.     XOR  AX,AX
  54.     INT  16h
  55.     CMP  CS:Byte Ptr BreakOn,1
  56.     JE   BreakCheck
  57. Fin:
  58.     PUSH DS
  59.      MOV  AX,251Bh
  60.      MOV  DX,Word Ptr OldIntr1Bh[0]
  61.      MOV  DS,Word Ptr OldIntr1Bh[2]
  62.      INT  21h
  63.     POP DS
  64.     PUSH DS
  65.      MOV  AX,2523h
  66.      MOV  DX,Word Ptr OldIntr23h[0]
  67.      MOV  DS,Word Ptr OldIntr23h[2]
  68.      INT  21h
  69.     POP DS
  70.     MOV  AX,4C00h                 
  71.     INT  21h                    
  72.     END

L'exemple suivant, écrit en Turbo Pascal 7, permet d'attendre qu'une touche autre que Ctrl+Break soit enfoncé pour terminer, cependant, si la combinaison de touche Ctrl+Break est enfoncé, affiche un message «Ctrl+Break enfoncé» :

  1. Program TestIntr23h;
  2.  
  3. Uses DOS;
  4.  
  5. Var
  6.  OldIntr1Bh:Pointer;
  7.  OldIntr23h:Pointer;
  8.  
  9. Procedure IntBrk;Interrupt;Begin
  10.  WriteLn('Ctrl+Break enfoncé');
  11. End;
  12.  
  13. BEGIN
  14.  GetIntVec($1B,OldIntr1Bh);
  15.  GetIntVec($23,OldIntr23h);
  16.  SetIntVec($1B,@IntBrk);
  17.  SetIntVec($23,@IntBrk);
  18.  ASM
  19.   XOR AX,AX
  20.   INT 16h
  21.  END;
  22.  SetIntVec($1B,OldIntr23h);
  23.  SetIntVec($23,OldIntr23h);
  24. END.

Références

Aide-mémoire des interruptions du MS-DOS, Edition Marabout, Philippe Mercier, 1990, ISBN: 2-501-01297-6, page 295 à 296.

Dernière mise à jour : Jeudi, le 3 mars 2016