Beaucoup pensent que la gestion des fichiers
en ASM est très complexe. Voici de quoi les faire changer d'avis...
La gestion des fichiers se fait grâce à
l'interruption 21h du DOS (qu'est ce qu'on ferait sans elle !!).
Fonction 3Dh : Ouvrir un fichier |
Entrées
| AH |
3Dh |
| AL |
Mode d'accès. Les principaux sont : |
|
0 = lecture seule |
|
1 = écriture seule |
|
2 = lecture + écriture |
| DS:DX |
Adresse logique du nom de fichier |
Sorties
| Carry Flag = 0 |
Fichier ouvert. AX = handle du fichier |
| Carry Flag = 1 |
Erreur d'ouverture. AX = code d'erreur |
|
2 = fichier non trouvé |
|
3 = chemin non trouvé ou fichier n'existe pas |
|
4 = plus de handle disponible |
|
5 = accès refusé |
En pratique...
|
.data |
| nom |
db |
"fichier.dat",0 |
; nom du fichier en chaîne
ASCIIZ |
|
.code |
|
... |
|
mov |
ax, 3D00h |
; fonction 3Dh + lecture
seule |
|
mov |
dx, offset nom |
; adresse effective de la
chaine |
|
int |
21h |
|
jc |
... |
; jump si erreur d'ouverture |
Rmq:
* Le handle est un nombre utilisé par le DOS pour
distinguer chaque fichier ouvert. Chaque fichier ouvert possède son propre handle.
* Le nom du fichier est stocké sous forme d'un chaîne
ASCIIZ (terminée par le caractère de code ASCII 0)
* Le pointeur du fichier est dirigé sur le premier octet
du fichier.
Fonction 3Eh : Fermer un fichier |
Tout fichier ouvert doit forcément être
fermé par la suite. Tout comme la fonction fclose du C, la fermeture provoque l'écriture
dans le fichier des données qui seraient toujours dans les buffers.
Entrées
| AH |
3Eh |
| BX |
Handle du fichier à fermer. |
Sorties
| Carry Flag = 0 |
Fichier fermé |
| Carry Flag = 1 |
Erreur de fermeture. AX = code d'erreur : |
|
6 = Handle non autorisé ou fichier non
ouvert |
En pratique...
|
mov |
ah, 3Eh |
|
pop |
bx |
; restauration du handle
dans BX |
|
int |
21h |
|
jc |
... |
; jmp si erreur |
Rmq:
* Les périphériques d'entrées ou de sorties standards
sont considérés comme des fichiers et possèdent donc un handle (0 à 4). La fermeture
d'un de ces handle rendrait impossible l'envoi de caractères à partir du clavier, ou
l'affichage de caractères à l'écran !! Gniark Gniark !!
Fonction 3Fh : Lire dans un fichier |
Cette fonction permet de lire un nombre
déterminé d'octets dans un fichier ouvert. Les caractères lus sont placés dans un
buffer.
Entrées
| AH |
3Fh |
| BX |
Handle du fichier |
| CX |
Nombre d'octets à lire |
| DS:DX |
Adresse logique du buffer |
Sorties
| Carry Flag = 0 |
Lecture réussie. AX = nombre d'octets lus. |
| Carry Flag = 1 |
Erreur. AX = code d'erreur |
|
5 = Accès refusé |
|
6 = Handle non autorisé ou fichier non
ouvert |
En
pratique...
|
.data |
|
|
| buf |
db |
100 dup ('0') |
; déclaration du buffer |
|
.code |
|
|
|
... |
|
; ouverture du fichier |
|
mov |
ah, 3Fh |
; fonction 3Fh |
|
pop |
bx |
; restauration du handle |
|
mov |
cx, 20 |
; lire 20 octets |
|
mov |
dx, offset buf |
; adresse effective du
buffer |
|
int |
21h |
|
|
jc |
... |
; jmp si erreur |
Fonction 40h : Ecrire dans un fichier |
Cette fonction permet d'écrire un nombre
déterminé d'octets dans un fichier. Les caractères à placer doivent être présents
dans un buffer.
Entrées
| AH |
40h |
| BX |
Handle du fichier |
| CX |
Nombre d'octets à écrire |
| DS:DX |
Adresse logique du buffer |
Sorties
| Carry Flag = 0 |
Ecriture réussie. AX = nombre d'octets
écrits. |
| Carry Flag = 1 |
Erreur. AX = code d'erreur |
|
5 = Accès refusé |
|
6 = Handle non autorisé ou fichier non
ouvert |
En
pratique...
|
.data |
|
|
| buf |
db |
100 dup ('0') |
; déclaration du buffer |
|
.code |
|
|
|
... |
|
; ouverture du fichier |
|
mov |
ah, 40h |
; fonction 40h |
|
pop |
bx |
; restauration du handle |
|
mov |
cx, 20 |
; écrire 20 octets |
|
mov |
dx, offset buf |
; adresse effective du
buffer |
|
int |
21h |
|
|
jc |
... |
; jmp si erreur |
|