Assemblage - Gestion de fichiers
Le système considère toutes les données d'entrée ou de sortie comme un flux d'octets. Il existe trois flux de fichiers standard -
- Entrée standard (stdin),
- Sortie standard (stdout), et
- Erreur standard (stderr).
Descripteur de fichier
UNE file descriptorest un entier de 16 bits attribué à un fichier en tant qu'ID de fichier. Lorsqu'un nouveau fichier est créé ou qu'un fichier existant est ouvert, le descripteur de fichier est utilisé pour accéder au fichier.
Descripteur de fichier des flux de fichiers standard - stdin, stdout et stderr sont 0, 1 et 2, respectivement.
Pointeur de fichier
UNE file pointerspécifie l'emplacement d'une opération de lecture / écriture ultérieure dans le fichier en octets. Chaque fichier est considéré comme une séquence d'octets. Chaque fichier ouvert est associé à un pointeur de fichier qui spécifie un décalage en octets, par rapport au début du fichier. Lorsqu'un fichier est ouvert, le pointeur de fichier est mis à zéro.
Appels système de gestion de fichiers
Le tableau suivant décrit brièvement les appels système liés à la gestion des fichiers -
% eax | Nom | % ebx | % ecx | % edx |
---|---|---|---|---|
2 | sys_fork | struct pt_regs | - | - |
3 | sys_read | entier non signé | char * | size_t |
4 | sys_write | entier non signé | const char * | size_t |
5 | sys_open | const char * | int | int |
6 | sys_close | entier non signé | - | - |
8 | sys_creat | const char * | int | - |
19 | sys_lseek | entier non signé | off_t | entier non signé |
Les étapes requises pour utiliser les appels système sont les mêmes, comme nous l'avons vu précédemment -
- Mettez le numéro d'appel système dans le registre EAX.
- Stockez les arguments de l'appel système dans les registres EBX, ECX, etc.
- Appelez l'interruption correspondante (80h).
- Le résultat est généralement renvoyé dans le registre EAX.
Créer et ouvrir un fichier
Pour créer et ouvrir un fichier, effectuez les tâches suivantes -
- Mettez l'appel système sys_creat () numéro 8, dans le registre EAX.
- Mettez le nom de fichier dans le registre EBX.
- Mettez les autorisations de fichier dans le registre ECX.
L'appel système renvoie le descripteur de fichier du fichier créé dans le registre EAX, en cas d'erreur, le code d'erreur se trouve dans le registre EAX.
Ouverture d'un fichier existant
Pour ouvrir un fichier existant, effectuez les tâches suivantes -
- Mettez l'appel système sys_open () numéro 5, dans le registre EAX.
- Mettez le nom de fichier dans le registre EBX.
- Mettez le mode d'accès aux fichiers dans le registre ECX.
- Mettez les autorisations de fichier dans le registre EDX.
L'appel système renvoie le descripteur de fichier du fichier créé dans le registre EAX, en cas d'erreur, le code d'erreur se trouve dans le registre EAX.
Parmi les modes d'accès aux fichiers, les plus couramment utilisés sont: lecture seule (0), écriture seule (1) et lecture-écriture (2).
Lecture à partir d'un fichier
Pour lire à partir d'un fichier, effectuez les tâches suivantes -
Mettez l'appel système sys_read () numéro 3, dans le registre EAX.
Mettez le descripteur de fichier dans le registre EBX.
Placez le pointeur sur le tampon d'entrée dans le registre ECX.
Mettez la taille du tampon, c'est-à-dire le nombre d'octets à lire, dans le registre EDX.
L'appel système renvoie le nombre d'octets lus dans le registre EAX, en cas d'erreur, le code d'erreur est dans le registre EAX.
Ecrire dans un fichier
Pour écrire dans un fichier, effectuez les tâches suivantes -
Mettez l'appel système sys_write () numéro 4, dans le registre EAX.
Mettez le descripteur de fichier dans le registre EBX.
Placez le pointeur sur le tampon de sortie dans le registre ECX.
Mettez la taille du tampon, c'est-à-dire le nombre d'octets à écrire, dans le registre EDX.
L'appel système renvoie le nombre réel d'octets écrits dans le registre EAX, en cas d'erreur, le code d'erreur se trouve dans le registre EAX.
Fermer un fichier
Pour fermer un fichier, effectuez les tâches suivantes -
- Mettez l'appel système sys_close () numéro 6, dans le registre EAX.
- Mettez le descripteur de fichier dans le registre EBX.
L'appel système renvoie, en cas d'erreur, le code d'erreur dans le registre EAX.
Mettre à jour un fichier
Pour mettre à jour un fichier, effectuez les tâches suivantes -
- Mettez l'appel système sys_lseek () numéro 19, dans le registre EAX.
- Mettez le descripteur de fichier dans le registre EBX.
- Mettez la valeur de décalage dans le registre ECX.
- Mettez la position de référence pour le décalage dans le registre EDX.
La position de référence pourrait être:
- Début de fichier - valeur 0
- Position actuelle - valeur 1
- Fin de fichier - valeur 2
L'appel système renvoie, en cas d'erreur, le code d'erreur dans le registre EAX.
Exemple
Le programme suivant crée et ouvre un fichier nommé myfile.txt et écrit un texte «Bienvenue dans Tutorials Point» dans ce fichier. Ensuite, le programme lit le fichier et stocke les données dans un tampon nommé info . Enfin, il affiche le texte tel qu'il est stocké dans les informations .
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
;create the file
mov eax, 8
mov ebx, file_name
mov ecx, 0777 ;read, write and execute by all
int 0x80 ;call kernel
mov [fd_out], eax
; write into the file
mov edx,len ;number of bytes
mov ecx, msg ;message to write
mov ebx, [fd_out] ;file descriptor
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
; close the file
mov eax, 6
mov ebx, [fd_out]
; write the message indicating end of file write
mov eax, 4
mov ebx, 1
mov ecx, msg_done
mov edx, len_done
int 0x80
;open the file for reading
mov eax, 5
mov ebx, file_name
mov ecx, 0 ;for read only access
mov edx, 0777 ;read, write and execute by all
int 0x80
mov [fd_in], eax
;read from file
mov eax, 3
mov ebx, [fd_in]
mov ecx, info
mov edx, 26
int 0x80
; close the file
mov eax, 6
mov ebx, [fd_in]
int 0x80
; print the info
mov eax, 4
mov ebx, 1
mov ecx, info
mov edx, 26
int 0x80
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
file_name db 'myfile.txt'
msg db 'Welcome to Tutorials Point'
len equ $-msg
msg_done db 'Written to file', 0xa
len_done equ $-msg_done
section .bss
fd_out resb 1
fd_in resb 1
info resb 26
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
Written to file
Welcome to Tutorials Point