Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouTeresa Rocha Clementino Alterado mais de 7 anos atrás
1
Programação em Assembly Ambiente de Programação Prof. Luiz Antonio Rodrigues Prof. Luiz Antonio Unioeste - Cascavel Jpanel e Diagramadores
2
Ambiente de Programação NASM - The Netwide Assembler Assembler que será utilizado nas práticas Manual em: http://nasm.sourceforge.net/doc/nasmdoc0.html http://nasm.sourceforge.net/doc/nasmdoc0.html Editor Qualquer editor de texto Eclipse tem plugin para Assembly Criar um executável Assemblagem e linkagem
3
Ambiente de Programação Assemblagem nasm -f Ex.: nasm -f elf exemplo.asm elf gera arquivo exemplo.o Se quiser informação de debug use -g Ex.: nasm -f elf -g exemplo.asm Linkagem Ex.: gcc -o -g exemplo exemplo.o Cria executável exemplo Para visualizar: objdump -D exemplo
4
Ambiente de Depuração DDD – Data Display Debugger Visualizador gráfico do gdb http://www.gnu.org/software/ddd/
5
Estrutura do Programa Seções obrigatórias.data.text Rótulo main (quando linkado pelo gcc) section.data ;variaveis section.text globl main main:
6
Primeiro Programa section.data hello: db ‘Hello word!’, 10 helloLen equ $-hello section.text global main main: mov eax, 4 ; system call para sys_write mov ebx, 1 mov ecx, hello mov edx, helloLen int 80h ; chamada do kernel mov eax, 1 ; system call para exit mov ebx, 0 ; parametro para exit int 80h
7
Alguns registradores
8
System Calls no Linux Você pode ter ajuda sobre qualquer chamada de sistema no Linux dando um man 2 syscall Ex.: man 2 write (Para sair da ajuda, tecle q.) O mecanismo de system call no Linux é semelhante ao DOS. Porém, sua interrupção é a int 80h e lidamos com 32 bits. No DOS, tinhamos 16 bits apenas.
9
System Calls no Linux Coloque o número da system call em EAX; Coloque os argumentos da system call em EBX, ECX e assim por diante - caso todos os regs estejam ocupados, EBX guarda o local na memória onde está a lista de argumentos; Chame a interrupção int 80h; O resultado da chamada geralmente é retornado em EAX.
10
Operações aritméticas e lógicas Operações: aritméticas: add, sub, inc, dec, cmp lógicas: and, or, xor, not Realizadas pela ALU Cada operação altera o estado das flags Exemplos: CF – Carry OF – Overflow ZF – Zero SF – Sign
11
ALU- Multiplicação e Divisão MUL fonte multiplica como inteiro sem sinal IMUL fonte multiplica como inteiro com sinal DIV fonte divide como inteiro sem sinal Exemplo: div bx Dividendo em DX e AX, divisor em bx Quociente em AX e o resto em DX IDIV fonte divide como inteiro com sinal
12
ALU- Multiplicação AL x fonte= AX (multiplicação de bytes, resultado em uma palavra) AXx fonte= DX:AX (multiplicação de palavras, resultado em palavra dupla) EAX x fonte = EDX:EAX (multiplicação de palavras duplas, resultado em 64 bits) CF e OF são ligados se a metade mais significativa do resultado não for apenas extensão do sinal; demais flags indefinidos
13
Carry Flag - CF CF a 1: se há transporte do bit mais significativo Interpretação do programa: uma op. aritmética sobre números sem sinal deu um resultado fora do domínio de valores válidos mov al, 0FFh 1111 1111 FFh (255) add al, 4 0000 0100 04 (4) 1 0000 0011 1 03h (259) CF = 1 al = 0000 0011 (limite válido é 255)
14
Overflow Flag - OF OF a 1: se uma op. aritmética sobre números com sinal, dá resultado fora do domínio de valores válidos mov al, 4 0000 0100 (4) add al, 7Fh 0111 1111 (127) 1000 0011 (-125? ) 131 A soma de dois números positivos não pode dar negativo! OF = 1 (4+127 > limite de 127)
15
Zero Flag - ZF ZF = 1 se resultado da última operação efetuada pela ALU for zero ZF = 0 se o resultado for diferente de zero Exemplo: mov ax, 2 sub ax, 2 ZF = 1 mov ax, 3 sub ax, 2 ZF = 0 0
16
Saltos condicionais (com um flag) Testam diretamente um flag: Carry CF=1 JC – Jump if Carry CF=0 JNC – Jump if Not Carry Overflow OF=1 JO – Jump if Overflow OF=0 JNO – Jump if Not Overflow Signal SF=1 JS – Jump if Sign SF=0 JNS – Jump if Not Sign Zero ZF=1 JZ – Jump if Zero ZF=0 JNZ – Jump if Not Zero
17
CMP - Compare cmp x,y faz x-y mas não guarda o resultado, apenas altera as flags CF = 1 se houver bit de borrow, (x<y para números sem sinal) OF=1 se houver overflow, ZF = 1 se os operandos forem iguais conclusão: cmp compara os dois operandos: usa-se em vez do sub quando se quer alterar apenas as flags
18
Rótulos (labels) Em vez de usar endereços, no assembly pode-se usar rótulos para as posições de memória Exemplo: ciclo representa o endereço de memória onde fica a instrução add eax, ebx ciclo: add eax, ebx jmp ciclo
19
Exemplo IF Como executar código diferente dependendo de uma condição? condição estado das flags salto condicional (jxx) if (condicao) codigo_do_then; else codigo_do_else; ; código que altere as flags ; (exemplo cmp eax, 5) jxx bloco_else ; codigo_do_then jmp fim_if bloco_else: ; codigo_do_else fim_if:
20
Exemplo: while while (condicao) codigo_do_ciclo; inicio_while: ; código que altere as flags ; (exemplo cmp ax, 5) jxx fim_while ; codigo_do_ciclo jmp inicio_while fim_while:
21
Exemplo: do-while do codigo_do_ciclo; while (condicao); inicio_do: ; codigo_do_ciclo ; código que altere as flags ; (exemplo cmp ax, 5) jxx inicio_do
22
Exemplo For ciclo com base num contador for ( i=n; i>0; i-- ) codigo_do_ciclo; ;exemplo: mov ecx, n inicio_for: cmp ecx, 0 je fim_for ; codigo_do_ciclo dec ecx jmp inicio_for fim_for:
23
Loop Salto com base num contador, para ciclos que executam pelo menos uma vez equivale a ‘dec cx’ seguido de ‘jnz’ Usa implicitamente o registo CX (16bits) for ( i=n; i>0; i-- ) codigo_do_ciclo; mov cx, n inicio_for: ; codigo_do_ciclo loop inicio_for
24
Exercícios Escrever os exemplos da aula II, compilar, linkar e executar usando o ddd
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.