Entrée et sortie de caractères depuis DOS
Lors de l'apprentissage d'un langage de programmation pour la première fois, de nombreux débutants apprennent les instructions d'entrée et de sortie de base du langage. De la même manière, les programmeurs acquièrent leur expérience de l'écriture de programmation accessible DOS en utilisant les fonctions d'entrée et de sortie de caractères. Pour cette raison, nous commençons par ces fonctions d'entrée et de sortie au lieu de fonctions plus complexes. Ces fonctions d'entrée et de sortie peuvent adresser le clavier, l'écran, l'imprimante et l'interface série.
Les fonctions peuvent être divisées en deux types : celles reprises du système d'exploitation CP/M et celles empruntées au système d'exploitation UNIX. Bien que les deux types de fonctions puissent être mélangés, nous vous recommandons d'utiliser un type de fonction tout au long d'un programme par souci de cohérence.
Les fonctions de type UNIX utilisent un descripteur de fichier comme identifiant d'un périphérique. En raison des tendances du DOS à se rapprocher d'UNIX, vous souhaiterez peut-être donner la priorité aux fonctions de descripteur de fichier.
Fonctions de descripteur de fichiers
Les fonctions de descripteur de fichier effectuent l'accès aux fichiers ainsi que l'entrée ou la sortie de caractères vers ou depuis un périphérique. DOS reconnaît la différence en examinant le nom attribué par le descripteur de fichier. Si le descripteur de fichier est un nom de périphérique, il adresse le périphérique ; sinon, il suppose que l'accès au fichier doit avoir lieu. Les noms des périphériques sont les suivants :
Périphérique | Description |
---|---|
CON | Clavier et écran |
AUX | Interface série |
PRN | Imprimante |
NUL | Périphérique imaginaire (rien ne se passe lors de l'accès) |
La sortie et l'entrée vont vers et depuis les périphériques AUX, PRN et NUL. Pour le périphérique CON, la sortie est envoyée à l'écran et l'entrée est lue à partir du clavier. Lorsque DOS passe le contrôle à un programme, cinq descripteurs de fichiers sont disponibles pour accéder aux périphériques individuels. Ces descripteurs de fichier ont des valeurs comprises entre 0 et 4 et représentent les périphériques suivants :
Descripteur de fichiers | Description |
---|---|
0 | Entrée standard (CON) |
1 | Sortie standard (CON) |
2 | Sortie standard pour les messages d'erreur (CON) |
3 | Interface série standard (AUX) |
4 | Imprimante standard (PRN) |
Afficher le message d'erreur
Si un programme veut accepter une entrée de l'utilisateur, la fonction de descripteur de fichier 0 l'indique pendant l'appel puisque le périphérique d'entrée standard est adressé. Le descripteur de fichier 0 représente normalement le clavier, permettant à l'utilisateur de saisir le programme de l'utilisateur. Puisque l'utilisateur peut rediriger l'entrée standard, vous pouvez rediriger l'entrée pour qu'elle provienne d'un fichier au lieu du clavier. Cette redirection reste cachée du programme.
Avant de discuter de ces périphériques, voici quelques fonctions utilisées pour accéder à n'importe quel périphériques.
La fonction 40h de l'interruption 21h envoie des données à un périphérique. Le numéro de fonction (40h) est passé dans le registre AH et le descripteur de fichier est passé dans le registre BX. Par exemple, pour afficher un message d'erreur, la valeur 2 indique le descripteur de fichier d'affichage du message d'erreur (ce périphérique ne peut pas être redirigé, donc le descripteur de fichier 2 s'adresse toujours à la console). Le nombre de caractères devant figurer dans le message d'erreur est passé dans le registre CX. Les caractères composant le message sont entreposés séquentiellement dans une mémoire dont l'adresse de segment est entreposée dans le registre DS et l'adresse de déplacement dans le registre DX.
Suite à l'appel de la fonction, le drapeau de retenue signale toute erreur. S'il n'y a pas eu d'erreur, le drapeau de retenue est réinitialisé et le registre AX contient le nombre de caractères ayant été affichés. Si le registre AX contient la valeur 0, alors il n'y avait plus d'espace disponible sur le support d'entreposage pour le message. Si le drapeau de retenue est défini, le message d'erreur n'a pas été envoyé et un code d'erreur est indiqué dans le registre AX. Un code d'erreur de 5 indique que le périphérique n'était pas disponible. Un code d'erreur de 6 indique que le descripteur de fichier n'a pas été ouverte.
La fonction 3Fh de l'interruption 21h lit les données de caractère d'un périphérique et présente de nombreuses similitudes avec la fonction précédente. Les deux fonctions ont une utilisation de registre identique. Le numéro de fonction est passé dans le registre AX et le descripteur de fichiers dans le registre BX. Le nombre de caractères lus est passé dans le registre CX et l'adresse mémoire des caractères transférés est passée dans le couple de registres DS:DX.
Suite à l'appel de la fonction, le drapeau de retenue signale également toute erreur. Encore une fois, tout code d'erreur est passé dans le registre AX. Les codes d'erreur 5 et 6 ont la même signification que lors de l'utilisation de la fonction 40h. Si le drapeau de retenue est réinitialisé, la fonction s'est exécutée avec succès. Le registre AX contient alors le nombre de caractères lus dans le tampon. Une valeur de 0 dans le registre AX signifie que les données à lire devraient provenir d'un fichier, mais que ce fichier ne contient plus de données.
Comme nous l'avons déjà mentionné, il est possible de rediriger l'entrée ou la sortie lors de l'accès au DOS. Par exemple, un programme attendant normalement une entrée du clavier peut être amené à accepter l'entrée d'un fichier. Ainsi, pour éviter que l'entrée ou la sortie ne soit redirigée, vous pouvez ouvrir un nouveau descripteur vers un périphérique spécifique qui garantit que le transfert de données vers ou depuis le périphérique souhaité a lieu au lieu de vers ou depuis un périphérique redirigé.
Utilisez la fonction 3Dh de l'interruption 21h pour ouvrir un tel périphérique.
Le numéro de fonction 3Dh est passé dans le registre AH. Le registre AL contient 0 pour permettre la lecture depuis le périphérique, 1 pour permettre l'écriture sur le périphérique et 2 pour la lecture et l'écriture sur le périphérique. Le nom du périphérique est placé en mémoire dont l'adresse est passée dans le couple de registres DS:DX. Pour que le DOS puisse identifier correctement le nom du périphérique, les noms doivent être spécifiés en majuscules. Le dernier caractère de la chaîne de caractères doit être un caractère de fin (valeur ASCII 0).
Après les appels de fonction, l'état est indiqué par le drapeau de retenue. Un drapeau de réinitialisation signifie que le périphérique a été ouvert avec succès et que le numéro de descripteur de fichier est renvoyé dans le registre AX. Un drapeau défini indique une erreur et le registre AX contient tout code d'erreur.
Le descripteur de fichier est fermée à l'aide de la fonction 3Eh de l'interruption 21h. Le numéro de fonction est passé dans le registre AH et le numéro de descripteur de fichier est passé dans le registre BX. Le drapeau de retenue indique à nouveau l'état de l'appel de fonction. Un drapeau de retenue défini indique une erreur.
Vous pouvez également fermer les poignées prédéfinies 0 à 4 à l'aide de cette fonction. Mais si vous fermez le descripteur de fichier 0 (le périphérique d'entrée standard), vous ne pourrez plus accepter les entrées du clavier. Examinons les caractéristiques particulières de chaque périphériques.
Clavier
Le clavier ne peut effectuer que des opérations de lecture. Les résultats des opérations de lecture dépendent du mode dans lequel le périphérique a été adressé. Ici, DOS fait la différence entre brute et Cooked. En mode Cooked, DOS vérifie chaque caractère envoyé à un périphérique ou reçu d'un périphérique pour voir s'il s'agit d'un caractère de contrôle spécial. Si DOS trouve un caractère de contrôle spécial, il exécute une certaine action en réponse au caractère. En mode brute, les caractères individuels sont passés sans contrôle et sans manipulation. DOS fait normalement fonctionner le périphérique en mode Cooked pour l'entrée et la sortie de caractères. Cependant, vous pouvez passer en mode brute au sein d'un programme.
La différence entre le mode brute et Cooked peut être mieux expliquée par un exemple de lecture du clavier. Supposons que 30 caractères soient lus à partir du clavier en mode Cooked. Au fur et à mesure que vous entrez les caractères, le DOS vous permet de modifier l'entrée à l'aide de plusieurs touches de contrôle. Par exemple Ctrl+C et Ctrl+Break annulent la saisie. Ctrl+S arrête temporairement le programme jusqu'à ce qu'une autre touche soit enfoncée.
Ctrl+P dirige les données suivantes de l'écran vers l'imprimante (jusqu'à ce que Ctrl+P soit à nouveau enfoncé). BackSpace supprime le dernier caractère du tampon DOS. Si la touche Enter est enfoncée, les 30 premiers caractères (ou tous les caractères saisis jusqu'à présent s'il y en a moins de 30) sont copiés du tampon DOS dans le tampon d'entrée du programme sans les caractères de contrôle.
En mode brut, tous les caractères saisis (y compris les caractères de contrôle) sont transmis au programme appelant sans que l'utilisateur n'ait à appuyer sur la touche Enter. Après exactement 30 caractères, le contrôle passe au programme appelant, même si vous avez appuyé sur la touche Enter comme deuxième caractère de l'entrée.
Écran
Pour afficher des caractères à l'écran, le descripteur de fichier 1 est généralement adressée comme périphérique de sortie standard. Étant donné que ce périphérique peut être redirigé, la sortie via ce descripteur de fichier peut être transmise à des périphériques autres que l'écran. En revanche, vous ne pouvez pas rediriger le périphérique de sortie d'erreur standard (descripteur de fichier 2), donc les messages d'erreur passant par ce descripteur de fichier apparaissent toujours à l'écran. Ce descripteur de fichier est recommandée pour l'affichage des caractères à l'écran uniquement.
L'écran est normalement adressé en mode Cooked - chaque caractère affiché à l'écran est testé pour les caractères de contrôle Ctrl+C ou Ctrl+Break. Ce test ralentit la sortie de l'écran, donc parfois le passage en mode brut diminue le temps d'exécution du programme.
Imprimante
Contrairement au clavier et à l'écran, la sortie de l'imprimante ne peut pas être redirigée, du moins pas depuis le niveau utilisateur. Une exception à cette règle est la redirection de la sortie d'une imprimante parallèle vers une imprimante série. Les caractères prêts à imprimer peuvent être envoyés dans une mémoire tampon avant d'être envoyés à l'imprimante. Le descripteur de fichier 4 sert à adresser l'imprimante standard. Il existe trois imprimantes standard LPT1, LPT2 et LPT3. Le périphérique PRN est synonyme de LPT1. Lorsque ce descripteur de fichier est ouverte, le nom du périphérique est spécifié comme l'un des trois : LPT1, LPT2 ou LPT3.
Interface série
La plupart des informations s'appliquant à l'imprimante s'appliquent également à l'interface série. Par exemple, l'entrée et la sortie série ne peuvent pas être redirigées vers un autre périphérique (par exemple, d'une imprimante série vers une imprimante parallèle). Le programmeur peut utiliser le descripteur de fichier prédéfinie 3 pour l'accès série, à travers laquelle vous pouvez adresser l'interface série standard (AUX).
Le descripteur de fichier 3 est utilisée pour adresser le périphérique série standard. Les deux sont nommés COM1 et COM2. Un PC peut avoir plusieurs interfaces série. Seuls les deux premiers (COM1 et COM2) sont pris en charge par DOS. Étant donné que le système ne sait pas exactement à quelle interface accéder lors de l'accès au périphérique AUX, vous devez ouvrir un nouveau descripteur de fichier pour accéder au descripteur de fichier spécifique.
Les erreurs lors des opérations de lecture en mode DOS sont renvoyées à l'interface série en mode Cooked. Le nombre renvoyé au registre AX ne correspondra pas au nombre de caractères effectivement lus. Nous vous recommandons d'utiliser l'interface série en mode brute, même si ce mode ignore les caractères de contrôle tels que Ctrl+C et EOF (fin de fichier).
Fonctions DOS traditionnelles
Les fonctions DOS d'entrée et de sortie ne sont pas basées sur les fonctions orientées descripteur de fichier. Si vous utilisez ces fonctions, vous n'aurez pas besoin de spécifier un descripteur de fichier, puisque chaque fonction se rapporte à un périphérique spécifique. Vous trouverez ci-dessous les différents périphériques d'entrée et de sortie et la manière dont ces fonctions fonctionnent avec eux.
Clavier
Il existe 7 fonctions DOS pour l'adressage du clavier, mais elles diffèrent à bien des égards. Par exemple, ils répondent différemment à la touche Ctrl+Break. Certaines fonctions font écho aux caractères à l'écran ; d'autres non.
Vous pouvez utiliser les fonctions 01h, 06h, 07h et 08h du DOS pour lire un seul caractère du clavier. Le numéro de fonction est passé dans le registre AH. Suite à l'appel, le caractère est renvoyé dans le registre AL.
Pour la fonction 01h du DOS, DOS attend une pression sur une touche si la mémoire tampon du clavier est vide. Lorsque cela se produit, le caractère est répercuté sur l'écran. Si la mémoire tampon du clavier n'est pas vide, un nouveau caractère est récupéré et renvoyé au programme appelant. L'exemple suivant permet de retourner dans le registre AL un caractère lu :
La fonction 06h du DOS peut être utilisée à la fois pour l'entrée et la sortie de caractères. Pour saisir un caractère, une valeur de FFh est chargée dans le registre DL. Cette fonction n'attend pas qu'un caractère soit saisi mais retourne immédiatement au programme appelant. Si le drapeau zéro est défini, un caractère n'a pas été lu. Si le drapeau zéro est réinitialisé, un caractère a été lu et renvoyé dans le registre AL. Le caractère n'est pas répercuté à l'écran.
Les fonctions 07h et 08h du DOS sont utilisées pour lire le clavier de la même manière que la fonction 01h. Les deux extraient un caractère du tampon du clavier ou attendent qu'un caractère soit saisi au clavier. Ni l'un ni l'autre ne font écho au caractère à l'écran. Ils diffèrent en ce que la fonction 08h répond à Ctrl+C et la fonction 07h ne le fait pas.
En utilisant la fonction 0Bh, un programme peut déterminer si un ou plusieurs caractères se trouvent dans la mémoire tampon du clavier avant d'appeler toute fonction lisant des caractères. Après appel de cette fonction, le registre AL contient 0 si le tampon clavier est vide, et FFh si le tampon clavier n'est pas vide. La fonction 0Ch du DOS est utilisée pour effacer la mémoire tampon du clavier. Une fois effacée, la fonction dont le numéro a été transmis à la fonction 0Ch dans le registre AL enregistrée est automatiquement appelée.
La fonction 0Ah du DOS permet de lire une chaîne de caractères. Encore une fois, ce numéro de fonction est passé dans le registre AH. De plus, l'adresse mémoire d'un tampon pour la chaîne de caractères est passée dans la paire de registres DS:DX. Ce tampon est utilisé pour contenir la chaîne de caractères. Le premier octet du tampon indique le nombre maximum de caractères pouvant être contenus dans le tampon.
Lorsque cette fonction est appelée, le DOS lit jusqu'au nombre maximum de caractères et les entrepose dans la mémoire tampon à partir du troisième octet. Il lit jusqu'à ce que le nombre maximum de caractères soit saisi ou que la touche Enter soit enfoncée. Le nombre réel de caractères est entreposé dans le deuxième octet du tampon. Des codes de touche étendus occupant chacun deux octets dans le tampon peuvent être saisis. Le premier octet de la paire (valeur ASCII 0) signifie qu'un code de touche étendu suit. Cela signifie, par exemple, que pour une taille de tampon maximale de 10 octets, seuls cinq caractères étendus peuvent être saisis.
Le tableau suivant illustre la façon dont les différentes fonctions répondent à Ctrl+C ou Ctrl+Break et fournit un aperçu rapide des fonctions individuelles pour la saisie de caractères :
Fonctions | Tâche | Ctrl+C | Écho |
---|---|---|---|
01h | Entrée de caractère | Oui | Oui |
06h | Entrée directe de caractère | Non | Non |
07h | Entrée de caractère | Non | Non |
08h | Entrée ce caractère | Oui | Non |
0Ah | Entrée de chaîne de caractères | Oui | Non |
0Bh | Lecture de l'état d'entrée | Oui | Non |
0Ch | Réinitialise l'entrée de tampon alors entrée | Variables | Variables |
Sortie écran
Il existe 3 fonctions DOS pour la sortie de caractères.
La fonction 02h de DOS produit un seul caractère sur l'écran ou le périphérique de sortie standard. Le caractère est transmis au registre DL. L'exemple suivant permet d'émettre un signal sonore de style «Beep» sur la console :
La fonction 06h du DOS étant polyvalente est également utilisée pour sortir un seul caractère. Le caractère est passé dans le registre DL. Vous pouvez voir que le caractère dont la valeur est 255 ne peut pas être sorti car cela indique que la fonction est d'effectuer une opération d'entrée. La sortie à l'aide de cette fonction est plus rapide qu'avec la fonction 02h car elle ne teste pas les touches Ctrl+C ou Ctrl+Break.
La fonction 09h du DOS est utilisée pour la sortie de chaîne de caractères. Encore une fois, le numéro de fonction est passé dans le registre AH. L'adresse de la chaîne de caractères est transmise dans la paire de registres DS:DX. Le dernier caractère de la chaîne de caractères est un signe dollar. De plus, les codes de contrôle suivants sont reconnus :
Code | Opération |
---|---|
7 | Bell : sonne la cloche sur le PC |
8 | BackSpace : efface le caractère précédent et recule le curseur d'un caractère |
10 | Line Feed (LF) : Déplace le curseur d'une ligne vers le bas |
13 | Carriage Return (CR) : Déplace le curseur au début de la ligne courante |
Comme pour la fonction 02h, cette fonction vérifie également Ctrl+C ou Ctrl+Break.
L'exemple suivant permet d'afficher un message sur la console :
Imprimante
La fonction 05h du DOS est utilisée pour envoyer un seul caractère à l'imprimante. Si l'imprimante est occupée, cette fonction attend qu'elle soit prête avant de rendre le contrôle au programme appelant. Pendant ce temps, il répondra aux touches Ctrl+C et Ctrl+Break.
Le numéro de fonction est passé dans le registre AH. Le caractère à sortir est passé dans le registre DL. L'état de l'imprimante n'est pas renvoyé. La plupart des programmeurs choisiront d'utiliser la fonction BIOS au lieu de la fonction DOS pour la sortie de l'imprimante car vous pouvez spécifier le périphérique d'impression exact et déterminer l'état de l'imprimante à l'aide de la version du BIOS.
L'exemple suivant permet d'afficher le caractère «Q» sur le périphérique d'impression :
Interface série
Il existe deux fonctions DOS pour communiquer à l'aide de l'interface série, une pour l'entrée et une pour la sortie. Les deux fonctions répondent à Ctrl+C et Ctrl+Break, mais elles ne renvoient pas l'état de l'interface série, ni ne reconnaissent les erreurs de transmission.
La fonction 03h du DOS est utilisée pour entrer des données à partir de l'interface série. Le caractère est retourné dans le registre AL. Étant donné que les données ne sont pas mises en mémoire tampon, les données peuvent dépasser l'interface si l'interface reçoit des données plus rapidement que cette fonction ne peut les gérer.
L'exemple suivant permet de lire un caractère de l'entrée auxiliaire standard et de l'entreposer dans la variable variable :
La fonction 04h du DOS est utilisée pour sortir des données sur l'interface série. Le caractère à sortir est passé dans le registre DL. Si l'interface série n'est pas prête à accepter les données, cette fonction attend qu'elle soit libre.
Encore une fois, la plupart des programmeurs préfèrent utiliser les fonctions équivalentes du BIOS pour effectuer la transmission de données en série en raison de leurs capacités de traitement de données plus complètes.
L'exemple suivant permet d'afficher le caractère «Q» sur le périphérique auxiliaire :