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

sys_read

int (0)

char *

tamanho

sys_write

int (1)

char *

tamanho

sys_open

char *

int

int

sys_close

int (0)

sys_create

char *

int

Gerenciamento de Arquivos
Permisses:

Ler

Escrever
Criador

Executar

Ler

Escrever
Grupo

Executar

Ler

Escrever
Outros

Executar

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

Ler

Escrever

Executar

Ler

Escrever

Executar

Ler

Escrever

Criador

Em octal = 0700q

Grupo

Outros

0
Executar

Gerenciamento de Arquivos
Permisses:
Outros no podem ter acesso ao arquivo.

Ler

Escrever

Executar

Ler

Escrever

Executar

Ler

Escrever

Criador

Em octal = 0770q

Grupo

Outros

0
Executar

Gerenciamento de Arquivos
Permisses:
Todos pode ler, escrever e executar o arquivo.

Ler

Escrever

Executar

Ler

Escrever

Executar

Ler

Escrever

Criador

Em octal = 0777q

Grupo

Outros

1
Executar

Gerenciamento de Arquivos
Criar e Abrir um arquivo:
sys_create (8)

mov
mov
mov
int

eax,(sys_create)
ebx,(nome do arquivo)
ecx,(permisses)
80h

Gerenciamento de Arquivos
Criar e Abrir um arquivo:
sys_create (8)

mov
mov
mov
int

eax,8
ebx,nome_arquivo
ecx,0777q
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
mov
mov
mov
int

eax,(sys_open)
ebx,(nome do arquivo)
ecx,(modo de acesso)
edx,(permisses)
80h

Gerenciamento de Arquivos
Abrir um arquivo:
sys_open (5)
Modos de acesso:
0

Somente Leitura

Somente Escrita

Leitura e Escrita

Gerenciamento de Arquivos
Abrir um arquivo:
sys_open (5)

mov
mov
mov
mov
int

eax,5
ebx,nome_arquivo
ecx,2
edx,0777q
80h

Gerenciamento de Arquivos
Ler um arquivo:
sys_read (3)

mov
mov
mov
mov
int

eax,(sys_read)
ebx,(identificador do arquivo)
ecx,(posio de memria a ser armazenado)
edx,(tamanho da varivel)
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
mov
mov
mov
int

eax,(sys_write)
ebx,(identificador do arquivo)
ecx,(posio de memria)
edx,(tamanho)
80h

Gerenciamento de Arquivos
Escrever em um arquivo:
sys_write (4)

mov
mov
mov
mov
int

eax,4
ebx,[id_file]
ecx,msg
edx,len
80h

Gerenciamento de Arquivos
Fechando um arquivo:
sys_close (6)
mov
mov
int

eax,(sys_close)
ebx,(identificador do arquivo)
80h

Gerenciamento de Arquivos
Fechando um arquivo:
sys_close (6)
mov
mov
int

eax,6
ebx,[id_file]
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
msg
len

db
db
equ

meu_arquivo.txt,0
Hello, World
$-msg

;nome do arquivo
;mensagem
;tamanho

Exemplo
section
id_out
id_in
info

.bss
resd
resd
resb

1
1
30

;identificador do arquivo de sada


;identificador do arquivo de entrada
;varivel para guardar contedo do arquivo

Exemplo
section
global

.text
_start:

_start:

mov
mov
mov
int

eax, 8
ebx, nome_arquivo
ecx, 0777q
0x80

;sys_create
;meu_arquivo.txt
;todas as permisses
;interrupo

mov

[id_out], eax

;guarda o identificador

Exemplo
section
global

.text
_start:

_start:

mov
mov
mov
mov
int

eax,4
ebx, [id_out]
ecx, msg
edx,len
0x80

;sys_write
;identificador do arquivo
;Hello, World
;tamanho
;interrupo

Exemplo
section
global

.text
_start:

_start:
mov
mov
int

eax, 6
ebx, [id_out]
0x80

;fechar arquivo
;identificador
;interrupo

Exemplo
section
global

.text
_start:

_start:

mov
mov
mov
mov
int

eax, 5
ebx, nome_arquivo
ecx, 0
edx, 0777q
0x80

;sys_open
;meu_arquivo.txt
;somente leitura
;todas as permisses
;interrupo

mov

[id_in], eax

;guarda identificador

Exemplo
section
global

.text
_start:

_start:

mov
mov
mov
mov
int

eax, 3
ebx, [id_in]
ecx, info
edx, 30
0x80

;sys_read
;identificador
;varivel para armazenar o contedo
;tamanho
;interrupo

Exemplo
section
global

.text
_start:

_start:
mov
mov
int

eax, 6
ebx, [id_in]
0x80

;fechar arquivo
;identificador
;interrupo

Exemplo
section
global

.text
_start:

_start:

mov
mov
mov
mov
int

eax, 4
ebx, 1
ecx, info
edx, 30
0x80

;sys_write
;terminal
;contedo do arquivo
;tamanho
;interrupo

Exemplo
section
global

.text
_start:

_start:
mov
mov
int

eax, 1
ebx, 0
0x80

;sys_exit
;sem erros
;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
apend
msg
len

.data
db
db
equ

"(copia).txt",0
;apndice do arquvio de sada
'Digite o nome do arquivo:',10
;mensagem
$-msg
;tamanho da mensagem

Projeto
section .bss

id_out
resd
id_in
resd
nome_arq
resb
arq_out
resb
tamanho_nome resd
tamanho_info resd
info
resb

1
1
30
41
1
1
400

;identificador do arquivo de sada


;identificador do arquivo de entrada
;nome do arquivo dado pelo usurio
;nome do arquivo de sada
;tamanho do nome do arquivo de sada
;tamanho do contedo do arquivo de entrada
;varivel para armazenar o contedo

Projeto
coloca_fim:
mov

ebx,0

;inicializa o contador

.for:

cmp
[nome_arq+ebx], byte 10
je.retorna
inc
ebx
jmp
.for

;compara com '\n'


;se for igual o fim da string recebida
;incrementa o contador
;volta para o lao

.retorna:
mov
ret

[nome_arq+ebx], byte 0

;insere 0 (fim da string)


;retorna

Projeto
coloca_apendice:
mov
mov

ebx,0
ecx,0

;inicializa o contador
;inicializa o contador

[nome_arq+ebx], byte '.'


.apendice
dl, [nome_arq+ebx]
[arq_out+ebx], dl
ebx
.for

;compara com '.'


;se for igual coloca o apendice
;copia o nome do arquivo
;copia o nome do arquivo
;incrementa o contador
;volta para o lao

.for:

cmp
je
mov
mov
inc
jmp

Projeto
.apendice:

cmp
je
mov
mov
inc
inc
jmp

.retorna:
mov
ret

;coloca o apndice (copia).txt


ecx,11
.retorna
dl, [apend+ecx]
[arq_out+ebx], dl
ecx
ebx
.apndice

;compara com 11 (tamanho do apndice)


;se for igual retorna
;copia o apendice
;copia o apendice
;incrementa contador
;incrementa contador
;volta para o lao

;fim do procedimento
[tamanho_nome],ebx ;guarda o tamanho do nome de sada
;retorna

Você também pode gostar