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