Exercício
Linguagem de Montagem
Assembly 80386 ...
Prof. João Paulo A. Almeida
([email protected])
• Faça um programa para ler uma linha de
comando (ou seja, caracteres até que encontre
um enter “\n”) e imprimir o resultado
• Assume que o tamanho máximo é 100
caracteres e que o usuário não vai tentar
ultrapassar esse tamanho
• Use call read_char
• Use call print_string
2007/01 - INF02597
(inclui slides de
Roberta Lima Gomes e Camilo Calvi)
Solução
Estruturas de laço
%include "asm_io.inc"
segment .data
input1
times 100 db 0
• LOOP rótulo
– decrementa ECX, se ECX != 0, salta
segment .bss
segment .text
global _asm_main
_asm_main:
enter 0,0
; setup routine
pusha
mov ecx, input1
; vamos usar ecx para implementar índice no vetor
le_caracter:
call read_char
mov [ecx], al
; valor do resultado em al é copiado para posição no vetor
inc ecx
; ponteiro para entrada é incrementado
cmp al, 0Ah
; compara com '\n'
jne le_caracter
; salta para le_caracter
popa
mov
leave
ret
mov byte [ecx], 0
; terminar string com 0
mov eax, input1
call print_string
; imprimir string
eax, 0
• LOOPE rótulo, LOOPZ rótulo
– decrementa ECX
– se, ECX != 0 e ZF=1, salta
• LOOPNE, LOOPNZ rótulo
– decrementa ECX
– se ECX != 0 e ZF=0, salta
• Estas operações não alteram o registrador de
flags
; return back to C
Estruturas de laço: exemplo: for
Estruturas de controle: if
soma = 0;
for ( i=10; i >0; i−− ) {
soma += i;
}
if ( condição )
then_block ;
cmp …
mov eax, 0
mov ecx, 10
loop_start:
add eax, ecx
loop loop_start
; eax é soma
; ecx é i
; para setar flags de acordo com
; a condição
jxx endif ; salta se a condição for falsa
; código para “then”
endif:
1
Estruturas de controle: if, else
Estruturas de controle: while
if ( condição )
while( condição ) {
corpo_do_while;
}
then_block ;
else
else_block ;
cmp …
; para setar flags de acordo com
; a condição
jxx else_block
; salta se a condição for falsa
; código para “then”
jmp endif
else_block:
; código para “else”
endif:
while:
cmp …
Estruturas de controle: exercício...
Resultado
; código para setar flags
; de acordo com a condição
jxx endwhile
; salta se condição for falsa
; ponha corpo_do_while aqui
jmp while
endwhile:
O que esse programa faz?
20
19
18
17
16
15
14
13
12
11
10
Estruturas de controle: exercício
Estruturas de controle: do ... while
eax = 20
do {
printf(“%d”,eax);
eax--;
} while( eax > 10 );
do {
corpo_do_dowhile;
} while( condição );
mov eax, 20
rotulo1:
call print_int
call print_nl
dec eax
cmp eax, 10
jge rotulo1
do:
mov eax, 20
rotulo1:
call print_int
call print_nl
dec eax
cmp eax, 10
jge rotulo1
; ponha o corpo_do_dowhile aqui;
CMP … ; código para setar flags de acordo
; com a condição
jxx do ; salta se condição for verdadeira
2
driver.c
#include "cdecl.h"
int PRE_CDECL asm_main( void ) POST_CDECL;
int main()
{
int ret_status;
ret_status = asm_main();
return ret_status;
}
skel.asm (“esqueleto”)
%include "asm_io.inc"
segment .data
; coloque os dados inicializados aqui
;
segment .bss
; coloque os dados não inicializados aqui
;
segment .text
global _asm_main
_asm_main:
enter 0,0
; inicialização
pusha
;
;
;
;
coloque o código aqui
popa
mov
leave
ret
eax, 0
; retorna ao C
NASM no Windows
NASM no Linux
• nasm –f win32 first.asm
• nasm –f elf first.asm
– arquivo: first.obj é criado (montado)
• nasm –f win32 asm_io.asm
– arquivo: asm_io.obj é criado (montado)
• gcc –c –o driver.obj driver.c
– driver.c é compilado e arquivo driver.obj é
criado
• gcc -o first driver.obj first.obj asm io.obj
– os arquivos objeto são ligados / “linkados” e
executável first.exe é criado
– arquivo: first.o é criado (montado)
• nasm –f elf –D ELF_TYPE asm_io.asm
– arquivo: asm_io.o é criado (montado)
• gcc –c –o driver.o driver.c
– driver.c é compilado e arquivo driver.o é
criado
• gcc -o first driver.o first.o asm io.o
– os arquivos objeto são ligados / “linkados” e
executável first é criado
Gerando listagens de programas
NASM
• Monta o programa, com código de máquina
aparente
• nasm –f win32/elf –l readstring.listing
readstring.asm
• p/ Windows: instalar Cygwin
– http://www.cygwin.com/
• Instalar os módulos: gcc e nasm
• Façam download do pacote com exemplos
do livro na página da disciplina
• Editor no Windows (totalmente opcional):
Crimson editor
– syntax highlighting (marca palavras de
diferentes funções com diferentes cores)
3
Linux
• Já instalado no laboratório da graduação
• http://sourceforge.net/projects/nasm/
• Baixar exemplos em:
– http://www.drpaulcarter.com/pcasm/linux-ex.zip
4
Download

slides da aula 8