Montagem - Gerenciamento de Arquivos
O sistema considera qualquer entrada ou saída de dados como fluxo de bytes. Existem três fluxos de arquivo padrão -
- Entrada padrão (stdin),
 - Saída padrão (stdout) e
 - Erro padrão (stderr).
 
Descritor de arquivo
UMA file descriptoré um inteiro de 16 bits atribuído a um arquivo como um id de arquivo. Quando um novo arquivo é criado ou um arquivo existente é aberto, o descritor de arquivo é usado para acessar o arquivo.
Descritor de arquivo dos fluxos de arquivo padrão - stdin, stdout e stderr são 0, 1 e 2, respectivamente.
Ponteiro de Arquivo
UMA file pointerespecifica o local para uma operação de leitura / gravação subsequente no arquivo em termos de bytes. Cada arquivo é considerado uma sequência de bytes. Cada arquivo aberto está associado a um ponteiro de arquivo que especifica um deslocamento em bytes, em relação ao início do arquivo. Quando um arquivo é aberto, o ponteiro do arquivo é definido como zero.
Arquivo de tratamento de chamadas do sistema
A tabela a seguir descreve resumidamente as chamadas de sistema relacionadas ao tratamento de arquivos -
| % eax | Nome | % ebx | % ecx | % edx | 
|---|---|---|---|---|
| 2 | sys_fork | struct pt_regs | - | - | 
| 3 | sys_read | int sem sinal | Caracteres * | size_t | 
| 4 | sys_write | int sem sinal | const char * | size_t | 
| 5 | sys_open | const char * | int | int | 
| 6 | sys_close | int sem sinal | - | - | 
| 8 | sys_creat | const char * | int | - | 
| 19 | sys_lseek | int sem sinal | off_t | int sem sinal | 
As etapas necessárias para usar as chamadas do sistema são as mesmas, conforme discutimos anteriormente -
- Coloque o número de chamada do sistema no registro EAX.
 - Armazene os argumentos para a chamada do sistema nos registros EBX, ECX, etc.
 - Ligue para a interrupção relevante (80h).
 - O resultado geralmente é retornado no registro EAX.
 
Criando e abrindo um arquivo
Para criar e abrir um arquivo, execute as seguintes tarefas -
- Coloque a chamada de sistema sys_creat () número 8, no registro EAX.
 - Coloque o nome do arquivo no registro EBX.
 - Coloque as permissões do arquivo no registro ECX.
 
A chamada do sistema retorna o descritor do arquivo criado no registro EAX, em caso de erro, o código do erro está no registro EAX.
Abrindo um arquivo existente
Para abrir um arquivo existente, execute as seguintes tarefas -
- Coloque a chamada de sistema sys_open () número 5, no registro EAX.
 - Coloque o nome do arquivo no registro EBX.
 - Coloque o modo de acesso ao arquivo no registro ECX.
 - Coloque as permissões do arquivo no registro EDX.
 
A chamada do sistema retorna o descritor do arquivo criado no registro EAX, em caso de erro, o código do erro está no registro EAX.
Entre os modos de acesso a arquivos, os mais comumente usados são: somente leitura (0), somente gravação (1) e leitura / gravação (2).
Lendo de um arquivo
Para ler um arquivo, execute as seguintes tarefas -
Coloque a chamada de sistema sys_read () número 3, no registro EAX.
Coloque o descritor de arquivo no registro EBX.
Coloque o ponteiro para o buffer de entrada no registro ECX.
Coloque o tamanho do buffer, ou seja, o número de bytes a serem lidos, no registro EDX.
A chamada do sistema retorna a quantidade de bytes lidos no registro EAX, em caso de erro, o código do erro está no registro EAX.
Gravando em um Arquivo
Para gravar em um arquivo, execute as seguintes tarefas -
Coloque a chamada de sistema sys_write () número 4, no registro EAX.
Coloque o descritor de arquivo no registro EBX.
Coloque o ponteiro para o buffer de saída no registro ECX.
Coloque o tamanho do buffer, ou seja, o número de bytes a serem escritos, no registrador EDX.
A chamada do sistema retorna o número real de bytes escritos no registro EAX, em caso de erro, o código do erro está no registro EAX.
Fechando um Arquivo
Para fechar um arquivo, execute as seguintes tarefas -
- Coloque a chamada de sistema sys_close () número 6, no registro EAX.
 - Coloque o descritor de arquivo no registro EBX.
 
A chamada do sistema retorna, em caso de erro, o código de erro no registro EAX.
Atualizando um arquivo
Para atualizar um arquivo, execute as seguintes tarefas -
- Coloque a chamada de sistema sys_lseek () número 19, no registro EAX.
 - Coloque o descritor de arquivo no registro EBX.
 - Coloque o valor de deslocamento no registro ECX.
 - Coloque a posição de referência para o deslocamento no registro EDX.
 
A posição de referência pode ser:
- Início do arquivo - valor 0
 - Posição atual - valor 1
 - Fim do arquivo - valor 2
 
A chamada do sistema retorna, em caso de erro, o código de erro no registro EAX.
Exemplo
O programa a seguir cria e abre um arquivo chamado myfile.txt e grava um texto 'Bem-vindo ao ponto de tutoriais' neste arquivo. Em seguida, o programa lê o arquivo e armazena os dados em um buffer denominado info . Por último, exibe o texto conforme armazenado nas informações .
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 o código acima é compilado e executado, ele produz o seguinte resultado -
Written to file
Welcome to Tutorials Point