Assemblaggio - Gestione file

Il sistema considera tutti i dati di input o output come flusso di byte. Sono disponibili tre flussi di file standard:

  • Input standard (stdin),
  • Output standard (stdout) e
  • Errore standard (stderr).

Descrittore del file

UN file descriptorè un numero intero a 16 bit assegnato a un file come ID file. Quando viene creato un nuovo file o viene aperto un file esistente, il descrittore di file viene utilizzato per accedere al file.

Descrittore di file dei flussi di file standard - stdin, stdout e stderr sono rispettivamente 0, 1 e 2.

Puntatore file

UN file pointerspecifica la posizione per una successiva operazione di lettura / scrittura nel file in termini di byte. Ogni file è considerato come una sequenza di byte. Ogni file aperto è associato a un puntatore al file che specifica un offset in byte, relativo all'inizio del file. Quando un file viene aperto, il puntatore del file viene impostato su zero.

Chiamate di sistema per la gestione dei file

La tabella seguente descrive brevemente le chiamate di sistema relative alla gestione dei file:

% eax Nome % ebx % ecx % edx
2 sys_fork struct pt_regs - -
3 sys_read unsigned int char * size_t
4 sys_write unsigned int const char * size_t
5 sys_open const char * int int
6 sys_close unsigned int - -
8 sys_creat const char * int -
19 sys_lseek unsigned int off_t unsigned int

I passaggi necessari per utilizzare le chiamate di sistema sono gli stessi, come abbiamo discusso in precedenza:

  • Metti il ​​numero di chiamata di sistema nel registro EAX.
  • Memorizza gli argomenti della chiamata di sistema nei registri EBX, ECX, ecc.
  • Chiama il relativo interrupt (80h).
  • Il risultato viene solitamente restituito nel registro EAX.

Creazione e apertura di un file

Per creare e aprire un file, eseguire le seguenti attività:

  • Metti la chiamata di sistema sys_creat () numero 8, nel registro EAX.
  • Metti il ​​nome del file nel registro EBX.
  • Metti i permessi del file nel registro ECX.

La chiamata di sistema restituisce il descrittore del file creato nel registro EAX, in caso di errore, il codice di errore è nel registro EAX.

Apertura di un file esistente

Per aprire un file esistente, eseguire le seguenti attività:

  • Metti la chiamata di sistema sys_open () numero 5, nel registro EAX.
  • Metti il ​​nome del file nel registro EBX.
  • Metti la modalità di accesso ai file nel registro ECX.
  • Metti i permessi del file nel registro EDX.

La chiamata di sistema restituisce il descrittore del file creato nel registro EAX, in caso di errore, il codice di errore è nel registro EAX.

Tra le modalità di accesso ai file, le più comunemente utilizzate sono: sola lettura (0), sola scrittura (1) e lettura-scrittura (2).

Leggere da un file

Per leggere da un file, eseguire le seguenti attività:

  • Metti la chiamata di sistema sys_read () numero 3, nel registro EAX.

  • Metti il ​​descrittore di file nel registro EBX.

  • Posiziona il puntatore al buffer di input nel registro ECX.

  • Metti la dimensione del buffer, cioè il numero di byte da leggere, nel registro EDX.

La chiamata di sistema restituisce il numero di byte letti nel registro EAX, in caso di errore, il codice di errore è nel registro EAX.

Scrittura su un file

Per scrivere su un file, eseguire le seguenti attività:

  • Metti la chiamata di sistema sys_write () numero 4, nel registro EAX.

  • Metti il ​​descrittore di file nel registro EBX.

  • Posiziona il puntatore al buffer di output nel registro ECX.

  • Inserite la dimensione del buffer, cioè il numero di byte da scrivere, nel registro EDX.

La chiamata di sistema restituisce il numero effettivo di byte scritti nel registro EAX, in caso di errore, il codice di errore è nel registro EAX.

Chiusura di un file

Per chiudere un file, eseguire le seguenti attività:

  • Metti la chiamata di sistema sys_close () numero 6, nel registro EAX.
  • Metti il ​​descrittore di file nel registro EBX.

La chiamata di sistema restituisce, in caso di errore, il codice di errore nel registro EAX.

Aggiornamento di un file

Per aggiornare un file, eseguire le seguenti attività:

  • Metti la chiamata di sistema sys_lseek () numero 19, nel registro EAX.
  • Metti il ​​descrittore di file nel registro EBX.
  • Metti il ​​valore di offset nel registro ECX.
  • Mettere la posizione di riferimento per l'offset nel registro EDX.

La posizione di riferimento potrebbe essere:

  • Inizio del file - valore 0
  • Posizione attuale - valore 1
  • Fine del file - valore 2

La chiamata di sistema restituisce, in caso di errore, il codice di errore nel registro EAX.

Esempio

Il seguente programma crea e apre un file denominato myfile.txt e scrive un testo "Welcome to Tutorials Point" in questo file. Successivamente, il programma legge dal file e memorizza i dati in un buffer denominato info . Infine, visualizza il testo come memorizzato in info .

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

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Written to file
Welcome to Tutorials Point