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