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
- Cette interruption ne doit jamais être émise directement.
- Le code d'initialisation d'une application peut utiliser l'interruption 21h, fonction 25h pour réinitialiser le vecteur Interruption 23h pour pointer vers sa propre routine pour la gestion Ctrl+C. De cette façon, le programme peut éviter d'être interrompu de façon inattendue à la suite de l'entrée par l'utilisateur d'un Ctrl+C ou Ctrl+Break.
- Lorsqu'un Ctrl+C est détecté et que le gestionnaire d'interruption 23h du programme reçoit le contrôle, tous les registres sont définis à leurs valeurs au point de l'appel de fonction d'origine. Le gestionnaire peut alors effectuer l'une des opérations suivantes : vous définissez un drapeau local pour une inspection ultérieure par l'application, ou prenez toute autre action appropriée et effectuez un IRET. Tous les registres doivent être conservés. La fonction DOS en cours sera redémarrée à partir de zéro et se terminera, le contrôle revenant enfin à l'application de la manière normale. Vous prenez les mesures appropriées, puis effectuez un RET FAR pour redonner le contrôle au DOS. L'état du drapeau de retenue est utilisé par DOS pour déterminer l'action à entreprendre. Si le drapeau de retenue est défini, l'application sera interrompue; si le drapeau de retenue est clair, l'application continuera normalement. Vous gardez le contrôle en transférant vers une routine de gestion des erreurs dans l'application, puis reprenez l'exécution ou prenez toute autre action appropriée, sans jamais exécuter RET FAR ou IRET pour terminer la séquence de gestion des interruptions. Cette option ne causera aucun dommage au système.
- Tout appel de fonction DOS peut être utilisé dans le corps d'un gestionnaire d'interruption 23h.
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é» :
- .MODEL small
- .STACK 100h
- .DATA
- MessageCtrlBreak DB 'Ctrl+Break enfoncé!',13,10,'$'
- OldIntr1Bh DD ?
- OldIntr23h DD ?
- .CODE
- IntBrk:
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET MessageCtrlBreak
- INT 21h
- IRET
- .startup
- MOV AX,351Bh
- INT 21h
- MOV Word Ptr OldIntr1Bh[0],BX
- MOV Word Ptr OldIntr1Bh[2],ES
- MOV AX,3523h
- INT 21h
- MOV Word Ptr OldIntr23h[0],BX
- MOV Word Ptr OldIntr23h[2],ES
- PUSH DS
- MOV AX,251Bh
- MOV DX,OFFSET IntBrk
- PUSH CS
- POP DS
- INT 21h
- MOV AX,2523h
- MOV DX,OFFSET IntBrk
- PUSH CS
- POP DS
- INT 21h
- POP DS
- XOR AX,AX
- INT 16h
- PUSH DS
- MOV AX,251Bh
- MOV DX,Word Ptr OldIntr1Bh[0]
- MOV DS,Word Ptr OldIntr1Bh[2]
- INT 21h
- POP DS
- PUSH DS
- MOV AX,2523h
- MOV DX,Word Ptr OldIntr23h[0]
- MOV DS,Word Ptr OldIntr23h[2]
- INT 21h
- POP DS
- MOV AX,4C00h
- INT 21h
- 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 :
- .MODEL small
- .STACK 100h
- .DATA
- MessageCtrlBreak DB 'souhaitez vous vraiment fermer le programme (O/N) ?',13,10,'$'
- OldIntr1Bh DD ?
- OldIntr23h DD ?
- .CODE
- BreakOn DB 0
- IntBrk:
- MOV CS:Byte Ptr BreakOn,1
- IRET
- BreakCheck:
- MOV CS:Byte Ptr BreakOn,0
- MOV AX,@data
- MOV DS,AX
- MOV AH,09h
- MOV DX,OFFSET MessageCtrlBreak
- INT 21h
- ReIntr:
- MOV AH,08h
- INT 21h
- CMP AL,'O'
- JE Fin
- CMP AL,'o'
- JE Fin
- CMP AL,'N'
- JE Restart
- CMP AL,'n'
- JE Restart
- JMP ReIntr
- .startup
- MOV AX,351Bh
- INT 21h
- MOV Word Ptr OldIntr1Bh[0],BX
- MOV Word Ptr OldIntr1Bh[2],ES
- MOV AX,3523h
- INT 21h
- MOV Word Ptr OldIntr23h[0],BX
- MOV Word Ptr OldIntr23h[2],ES
- PUSH DS
- MOV AX,251Bh
- MOV DX,OFFSET IntBrk
- PUSH CS
- POP DS
- INT 21h
- MOV AX,2523h
- MOV DX,OFFSET IntBrk
- PUSH CS
- POP DS
- INT 21h
- POP DS
- Restart:
- XOR AX,AX
- INT 16h
- CMP CS:Byte Ptr BreakOn,1
- JE BreakCheck
- Fin:
- PUSH DS
- MOV AX,251Bh
- MOV DX,Word Ptr OldIntr1Bh[0]
- MOV DS,Word Ptr OldIntr1Bh[2]
- INT 21h
- POP DS
- PUSH DS
- MOV AX,2523h
- MOV DX,Word Ptr OldIntr23h[0]
- MOV DS,Word Ptr OldIntr23h[2]
- INT 21h
- POP DS
- MOV AX,4C00h
- INT 21h
- 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é» :
- Program TestIntr23h;
-
- Uses DOS;
-
- Var
- OldIntr1Bh:Pointer;
- OldIntr23h:Pointer;
-
- Procedure IntBrk;Interrupt;Begin
- WriteLn('Ctrl+Break enfoncé');
- End;
-
- BEGIN
- GetIntVec($1B,OldIntr1Bh);
- GetIntVec($23,OldIntr23h);
- SetIntVec($1B,@IntBrk);
- SetIntVec($23,@IntBrk);
- ASM
- XOR AX,AX
- INT 16h
- END;
- SetIntVec($1B,OldIntr23h);
- SetIntVec($23,OldIntr23h);
- 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.