Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Une brève histoire de DOS
Structure interne de DOS
Démarrage du DOS
Programmes COM et EXE
Entrée et sortie de caractères depuis DOS
Gestion de fichiers sous DOS
Accéder au répertoire DOS
La fonction EXEC
Allocation de mémoire depuis DOS
Filtres DOS
Ctrl+Break et interruptions d'erreur critique
Pilotes de périphériques DOS
Entreposage de masse DOS
Conseils sur la compatibilité entre les ordinateurs PC
Structures DOS non documentées
Les différences du DOS 4.0
Format de fichiers
Structure de données
Interruptions
CONFIG.SYS
.BAT
.COM
.EXE
Liste des exécutables populaires (.EXE)
FCB (File Control Block)
PSP (Prefix Segment Program)
21h: Service DOS
2Ah: Interface de service réseau
2Fh: Multiplexe
33h: Interface du pilote de souris
67h: Gestionnaire EMM/EMS
FFh, 92h: Détecte la présence du pilote «PREDIR.EXE»
16h: Windows & DPMI
0Ah: Détection de Windows
84h: Demande le point d'entrée
86h: Détection du mode DPMI
87h: Détecte l'installation DPMI
8Eh: Machine virtuel et application
Préface
Notes légal
Dictionnaire
Recherche

Ctrl+Break et interruptions d'erreur critique

Le DOS offre deux manières d'arrêter un programme pendant son exécution. Ces situations se produisent lorsque l'utilisateur appuie sur Ctrl+Break (Ctrl+C, ou lorsqu'une erreur critique se produit lors de l'accès à un périphérique externe (exemple : imprimante, disque dur, unité de disque,...). La combinaison de touches varie selon la configuration du PC, nous utiliserons Ctrl+Break de manière cohérente dans cette page.

Ctrl+Break

Appuyer sur Ctrl+Break pour arrêter un programme en cours d'exécution peut avoir de graves conséquences. Une fois que l'utilisateur a appuyé sur cette combinaison de touches, le DOS prend brusquement le contrôle du programme sans permettre au programme d'effectuer le "ménage" pouvant être nécessaire. Les fichiers ne sont pas fermés correctement, les vecteurs d'interruption détournés ne sont pas réinitialisés et la mémoire allouée n'est pas libérée. Le résultat final peut aller d'une perte de données à un plantage du système.

Afin d'éviter cela, le DOS appelle l'interruption 23h. Cette interruption est également connue sous le nom d'interruption Ctrl+Break. Lorsqu'un programme est lancé, cette interruption pointe sur une routine provoquant la fin du programme. Mais un programme est libre de sélectionner sa propre routine, gardant ainsi le contrôle de ce qui se passe lorsque l'utilisateur appuie sur Ctrl+Break.

Cependant, la routine d'interruption ne s'exécute pas immédiatement. Le drapeau d'interruption contrôle le moment où la routine d'interruption se produit. Ce drapeau peut être défini au prompt DOS à l'aide de la commande BREAK (ON/OFF) du DOS, ou à l'aide de la fonction 33h du DOS, sous-fonction 1. Si l'indicateur d'interruption est activé, chaque fois qu'une fonction du DOS de l'interruption 21h est appelé, le tampon du clavier sera vérifié pour voir si Ctrl+Break ou Ctrl+C a été pressé. Si le drapeau d'arrêt est désactivé, cette vérification sera effectuée uniquement lors de l'appel des fonctions DOS accédant aux périphériques d'entrée et de sortie standard.

Si ce test trouve la combinaison de touches appropriée, les registres du microprocesseur sont chargés avec les valeurs contenues dans la fonction DOS à exécuter. Ce n'est qu'après cela que l'interruption 23h est appelée.

Si un programme dirige cette interruption vers une routine qui lui est propre, il existe plusieurs façons de réagir. Par exemple, le programme pourrait ouvrir une fenêtre à l'écran demandant si l'utilisateur souhaite terminer le programme. Il peut également décider lui-même si le programme doit ou non se terminer.

Maintenance

Si le programme choisit d'arrêter l'exécution, une certaine forme de routine de nettoyage doit suivre. Une routine de ce type ferme tous les fichiers ouverts, réinitialise tous les pointeurs d'interruption modifiés et libère toute mémoire allouée. Après cela, la fonction 4Ch peut terminer le programme sans rendre le contrôle à l'appelant de l'interruption 23h.

Si Ctrl+Break doit être ignoré, l'instruction en langage assembleur IRET doit rendre le contrôle au DOS. Le programme doit alors s'assurer que tous les registres du processeur contiennent les mêmes valeurs qu'ils avaient lorsque l'interruption 23h a été appelée. Sinon, la fonction DOS appelée à l'origine ne peut pas être exécutée sans erreur.

Interruption d'erreur critique

Contrairement à l'interruption Ctrl+Break, l'appel d'interruption d'erreur critique est rarement une réaction à quelque chose que l'utilisateur fait intentionnellement. Il s'agit généralement d'une réaction à une erreur se produisant lors de l'accès à un périphérique externe, tel qu'une imprimante, un unité de disque ou un disque dur. Bien que l'utilisateur puisse corriger l'erreur dans de nombreux cas (par exemple, l'imprimante n'est pas allumée), d'autres erreurs peuvent être causées par des pannes matérielles nécessitant des réparations (par exemple, une erreur de lecture lors de l'accès au disque dur).

Pour tenir compte des différents types d'erreurs, l'interruption d'erreur critique (interruption 24h) pointe normalement vers une routine DOS affichant le message suivant ou un message similaire à l'écran et attend une entrée de l'utilisateur :

(A)bort (R)etry (I)gnore (F)ail

Cela efface l'écran du programme en cours d'exécution. De plus, cette interruption ne fournit pas une fin de programme "propre". Comme Ctrl+Break, le programme se trouve dans une situation où les fichiers ne sont pas correctement fermés, la mémoire allouée n'est pas libérée,...

L'installation d'un gestionnaire d'interruptions dans un programme pour remplacer le gestionnaire DOS peut également aider ici. Le DOS demande l'aide d'un registre de microprocesseur pour transmettre à ce gestionnaire diverses informations lorsqu'il est appelé. Cela aide le gestionnaire d'interruption à localiser la source de l'erreur. Le bit 7 du registre AH indique une erreur d'accès à la disquette ou au disque dur (bit 7 de O, ou une autre erreur (bit 7 activé). De plus, la paire de registres BP:SI pointe vers la tête du pilote de périphérique étant en cours d'exécution appelé lorsque l'erreur est apparue. Un code d'erreur détaillé est contenu dans les 8 bits inférieurs du registre DI et le contenu des 8 bits supérieurs n'est pas défini. Cela renvoie les codes d'erreur suivants :

Code Description
00h Le disque est protégé en écriture
01h Accéder à un périphérique inconnu
02h Disque pas prêt
03h Commande inconnue
04h Erreur CRC
05h Longueur de données erronée
06h Erreur de recherche
07h Type de périphérique inconnu
08h Secteur introuvable
09h Imprimante à court de papier
0Ah Erreur d'écriture
0Bh Erreur de lecture
0Ch Erreur générale

Lorsqu'il est appelé, le gestionnaire d'erreurs critiques peut répondre en ouvrant une fenêtre à l'écran demandant à l'utilisateur de décider d'ignorer l'erreur, de réessayer l'accès ou d'abandonner le programme. Cette dernière option peut uniquement demander à l'interruption d'appeler les fonctions DOS de 01h vers 0Ch. Cela signifie que le programme se termine brusquement, comme si vous appuyiez sur Ctrl+Pause. S'il est vrai que l'appel d'autres fonctions DOS dans le gestionnaire ne provoque aucune erreur en soi, le retour au DOS provoque un plantage du système. Ces gestionnaires ne sont pas non plus autorisés à terminer un programme via l'utilisation de la fonction 4Ch du DOS. Au lieu de cela, le gestionnaire doit retourner à son appelant à l'aide de l'instruction IRET. Avec cela, DOS attend un code dans le registre AL qui lui montrera comment réagir à l'erreur. Il interprète le contenu du registre AL comme suit :

Code Description
00h Ignorer l'erreur
01h Recommencez l'opération
02h Fin de programme avec l'interruption 23h
03h Fonction de fin appelée avec une erreur (DOS 3.0 et supérieur uniquement)

Le dernier code de sortie dans la liste ci-dessus représente la réaction la plus sensible à une erreur ne pouvant pas être corrigée en répétant l'opération (comme dans l'exemple où l'imprimante doit être allumée). La réception de ce code appel la fin normale de l'appel de fonction dans lequel l'erreur s'est produite. La fonction définit alors le drapeau de retenue pour signaler l'erreur. Bien que cela rende une erreur "critique" et une erreur "normale" indiscernables pour le programme, il est possible de les différencier en définissant un drapeau dans le gestionnaire d'erreurs critiques.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Lundi, le 23 janvier 2023