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