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