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