Você está na página 1de 37

Linguagem de Montagem

Aula 9
Prof. Dr. Norian Marranghelo
Eduardo Nascimento
Agenda
Gerenciamento de Arquivos

Exemplo

Projeto
Gerenciamento de Arquivos
System Calls:

%eax Nome %ebx %ecx %edx


3 sys_read int (0) char * tamanho
4 sys_write int (1) char * tamanho
5 sys_open char * int int
6 sys_close int (0) - -
8 sys_create char * int -
Gerenciamento de Arquivos
Permisses:

Ler Escrever Executar Ler Escrever Executar Ler Escrever Executar


Criador Grupo Outros
Gerenciamento de Arquivos
Permisses:
Somente o criador pode ler, escrever e executar.

1 1 1 0 0 0 0 0 0
Ler Escrever Executar Ler Escrever Executar Ler Escrever Executar
Criador Grupo Outros

Em octal = 0700q
Gerenciamento de Arquivos
Permisses:
Outros no podem ter acesso ao arquivo.

1 1 1 1 1 1 0 0 0
Ler Escrever Executar Ler Escrever Executar Ler Escrever Executar
Criador Grupo Outros

Em octal = 0770q
Gerenciamento de Arquivos
Permisses:
Todos pode ler, escrever e executar o arquivo.

1 1 1 1 1 1 1 1 1
Ler Escrever Executar Ler Escrever Executar Ler Escrever Executar
Criador Grupo Outros

Em octal = 0777q
Gerenciamento de Arquivos
Criar e Abrir um arquivo:

sys_create (8)

mov eax,(sys_create)
mov ebx,(nome do arquivo)
mov ecx,(permisses)
int 80h
Gerenciamento de Arquivos
Criar e Abrir um arquivo:

sys_create (8)

mov eax,8
mov ebx,nome_arquivo
mov ecx,0777q
int 80h

section .data
nome_arquivo db meu_arquivo.txt,0
Gerenciamento de Arquivos
Criar e Abrir um arquivo:

sys_create (8)

Depois de executado o cdigo, o identificador do arquivo armazenado em


eax, se no tiver nenhum erro.
Gerenciamento de Arquivos
Criar e Abrir um arquivo:

sys_create (8)

Em caso de erro, o cdigo do erro armazenado em eax tambm.

Por exemplo, no existe o diretrio ou arquivo especificado.


Gerenciamento de Arquivos
Abrir um arquivo:

sys_open (5)

mov eax,(sys_open)
mov ebx,(nome do arquivo)
mov ecx,(modo de acesso)
mov edx,(permisses)
int 80h
Gerenciamento de Arquivos
Abrir um arquivo:

sys_open (5)

Modos de acesso:

0 - Somente Leitura

1 - Somente Escrita

2 - Leitura e Escrita
Gerenciamento de Arquivos
Abrir um arquivo:

sys_open (5)

mov eax,5
mov ebx,nome_arquivo
mov ecx,2
mov edx,0777q
int 80h
Gerenciamento de Arquivos
Ler um arquivo:

sys_read (3)

mov eax,(sys_read)
mov ebx,(identificador do arquivo)
mov ecx,(posio de memria a ser armazenado)
mov edx,(tamanho da varivel)
int 80h
Gerenciamento de Arquivos
Ler um arquivo:

sys_read (3)

Depois de executado o cdigo, eax contm o nmero de bytes lidos, ou em


caso de erro, contm o cdigo de erro.

Se eax for menor que edx, quer dizer que o nmero de bytes lidos menor
que o especificado, assim pode-se determinar que eax fim do arquivo (EOF).
Gerenciamento de Arquivos
Escrever em um arquivo:

sys_write (4)

mov eax,(sys_write)
mov ebx,(identificador do arquivo)
mov ecx,(posio de memria)
mov edx,(tamanho)
int 80h
Gerenciamento de Arquivos
Escrever em um arquivo:

sys_write (4)

mov eax,4
mov ebx,[id_file]
mov ecx,msg
mov edx,len
int 80h
Gerenciamento de Arquivos
Fechando um arquivo:

sys_close (6)

mov eax,(sys_close)
mov ebx,(identificador do arquivo)
int 80h
Gerenciamento de Arquivos
Fechando um arquivo:

sys_close (6)

mov eax,6
mov ebx,[id_file]
int 80h
Exemplo
Criar um arquivo com o nome meu_arquivo.txt, escrever no arquivo
Hello, World, fechar o arquivo, abrir o arquivo meu_arquivo.txt,
ler o contedo do arquivo, escrever na tela o contedo do arquivo.
Exemplo
section .data

nome_arq db meu_arquivo.txt,0 ;nome do arquivo


msg db Hello, World ;mensagem
len equ $-msg ;tamanho
Exemplo
section .bss

id_out resd 1 ;identificador do arquivo de sada


id_in resd 1 ;identificador do arquivo de entrada
info resb 30 ;varivel para guardar contedo do arquivo
Exemplo
section .text
global _start:
_start:
mov eax, 8 ;sys_create
mov ebx, nome_arquivo ;meu_arquivo.txt
mov ecx, 0777q ;todas as permisses
int 0x80 ;interrupo

mov [id_out], eax ;guarda o identificador
Exemplo
section .text
global _start:
_start:
mov eax,4 ;sys_write
mov ebx, [id_out] ;identificador do arquivo
mov ecx, msg ;Hello, World
mov edx,len ;tamanho
int 0x80 ;interrupo
Exemplo
section .text
global _start:
_start:
mov eax, 6 ;fechar arquivo
mov ebx, [id_out] ;identificador
int 0x80 ;interrupo
Exemplo
section .text
global _start:
_start:
mov eax, 5 ;sys_open
mov ebx, nome_arquivo ;meu_arquivo.txt
mov ecx, 0 ;somente leitura
mov edx, 0777q ;todas as permisses
int 0x80 ;interrupo

mov [id_in], eax ;guarda identificador
Exemplo
section .text
global _start:
_start:
mov eax, 3 ;sys_read
mov ebx, [id_in] ;identificador
mov ecx, info ;varivel para armazenar o contedo
mov edx, 30 ;tamanho
int 0x80 ;interrupo
Exemplo
section .text
global _start:
_start:
mov eax, 6 ;fechar arquivo
mov ebx, [id_in] ;identificador
int 0x80 ;interrupo
Exemplo
section .text
global _start:
_start:
mov eax, 4 ;sys_write
mov ebx, 1 ;terminal
mov ecx, info ;contedo do arquivo
mov edx, 30 ;tamanho
int 0x80 ;interrupo
Exemplo
section .text
global _start:
_start:
mov eax, 1 ;sys_exit
mov ebx, 0 ;sem erros
int 0x80 ;interrupo
Projeto
Fazer um programa que copia arquivos. O programa primeiramente
pede o nome do arquivo para o usurio, coloca o nome em uma
varivel e insere o nmero 0 (fim da string) no final do nome do
arquivo. Logo em seguida ele l o contedo do arquivo e armazena
em uma varivel de tamanho 400 (bytes). Por fim o programa cria
uma arquivo com o apndice (copia).txt e escreve o contedo lido
anteriormente.
Projeto
section .data

apend db "(copia).txt",0 ;apndice do arquvio de sada


msg db 'Digite o nome do arquivo:',10 ;mensagem
len equ $-msg ;tamanho da mensagem
Projeto
section .bss

id_out resd 1 ;identificador do arquivo de sada


id_in resd 1 ;identificador do arquivo de entrada
nome_arq resb 30 ;nome do arquivo dado pelo usurio
arq_out resb 41 ;nome do arquivo de sada
tamanho_nome resd 1 ;tamanho do nome do arquivo de sada
tamanho_info resd 1 ;tamanho do contedo do arquivo de entrada
info resb 400 ;varivel para armazenar o contedo
Projeto
coloca_fim:
mov ebx,0 ;inicializa o contador
.for:
cmp [nome_arq+ebx], byte 10 ;compara com '\n'
je.retorna ;se for igual o fim da string recebida
inc ebx ;incrementa o contador
jmp .for ;volta para o lao
.retorna:
mov [nome_arq+ebx], byte 0 ;insere 0 (fim da string)
ret ;retorna
Projeto
coloca_apendice:
mov ebx,0 ;inicializa o contador
mov ecx,0 ;inicializa o contador
.for:
cmp [nome_arq+ebx], byte '.' ;compara com '.'
je .apendice ;se for igual coloca o apendice
mov dl, [nome_arq+ebx] ;copia o nome do arquivo
mov [arq_out+ebx], dl ;copia o nome do arquivo
inc ebx ;incrementa o contador
jmp .for ;volta para o lao
Projeto
.apendice: ;coloca o apndice (copia).txt
cmp ecx,11 ;compara com 11 (tamanho do apndice)
je .retorna ;se for igual retorna
mov dl, [apend+ecx] ;copia o apendice
mov [arq_out+ebx], dl ;copia o apendice
inc ecx ;incrementa contador
inc ebx ;incrementa contador
jmp .apndice ;volta para o lao
.retorna: ;fim do procedimento
mov [tamanho_nome],ebx ;guarda o tamanho do nome de sada
ret ;retorna

Você também pode gostar