ASSEMBLY – aula 2 ASSEMBLY – aula 2
Armando Gonçalves Armando Gonçalves
Ciro Ceissler
Ciro Ceissler
Roteiro Roteiro
1- Intel x AT&T 1- Intel x AT&T
2- Pilha e command line arguments 2- Pilha e command line arguments 4- Simulando alguns comandos C 4- Simulando alguns comandos C 5- Assembly inline
5- Assembly inline
7- Exemplos de código c/c++
7- Exemplos de código c/c++
8- Exemplos de código Assembly inline 8- Exemplos de código Assembly inline
Intel x AT&T Intel x AT&T
Diferenças: Diferenças:
1- Ordenação entre source e destination 1- Ordenação entre source e destination
2- Nome dos registradores 2- Nome dos registradores
3- Operandos imediatos (immediate) 3- Operandos imediatos (immediate)
4- Tamanho dos operandos 4- Tamanho dos operandos
5- Operandos na memória 5- Operandos na memória
Intel x AT&T Intel x AT&T
Intel Code
Intel Code AT&T CodeAT&T Code
mov eax,1 mov eax,1 mov ebx,0ffh mov ebx,0ffh int 80h int 80h mov ebx, eax mov ebx, eax mov eax,[ecx]
mov eax,[ecx]
mov eax,[ebx+3]
mov eax,[ebx+3]
mov eax,[ebx+20h]
mov eax,[ebx+20h]
add eax,[ebx+ecx*2h]
add eax,[ebx+ecx*2h]
lea eax,[ebx+ecx]
lea eax,[ebx+ecx]
sub eax,[ebx+ecx*4h-20h]
sub eax,[ebx+ecx*4h-20h]
movl $1,%eax movl $1,%eax movl $0xff,%ebx movl $0xff,%ebx int $0x80
int $0x80
movl %eax, %ebx movl %eax, %ebx movl (%ecx),%eax movl (%ecx),%eax movl 3(%ebx),%eax movl 3(%ebx),%eax movl 0x20(%ebx),%eax movl 0x20(%ebx),%eax
addl (%ebx,%ecx,0x2),%eax addl (%ebx,%ecx,0x2),%eax leal (%ebx,%ecx),%eax leal (%ebx,%ecx),%eax
subl -0x20(%ebx,%ecx,0x4),%eax subl -0x20(%ebx,%ecx,0x4),%eax
Intel x AT&T Intel x AT&T
- Exemplo: Fatorial - Exemplo: Fatorial
CC
int fatorial (int numero) { int fatorial (int numero) {
int y = 1;
int y = 1;
if (numero <= 1) if (numero <= 1)
return 1;
return 1;
y = numero * fatorial (numero - 1);
y = numero * fatorial (numero - 1);
return y;
return y;
}}
Intel x AT&T Intel x AT&T
- Exemplo: Fatorial - Exemplo: Fatorial
IntelIntel
segment .data segment .data segment .bsssegment .bss segment .textsegment .text
global _asm_mainglobal _asm_main
_asm_main:_asm_main:
mov eax, 5mov eax, 5
mov ebx, 1mov ebx, 1 L1:L1:
cmp eax, 0cmp eax, 0 je L2
je L2
imul ebx, eax imul ebx, eax dec eax
dec eax jmp L1 jmp L1 L2: ret L2: ret
Intel x AT&T Intel x AT&T
- Exemplo: Fatorial - Exemplo: Fatorial
AT&TAT&T
.globl main .globl main main:
main:
movl $5, %eax movl $5, %eax movl $1, %ebx movl $1, %ebx
L1: L1: cmpl $0, %eaxcmpl $0, %eax //compara 0 com o valor em //compara 0 com o valor em eaxeax je L2
je L2 //pula p/ L2 se 0==eax (je – pula se igual)//pula p/ L2 se 0==eax (je – pula se igual)
imull %eax, %ebx
imull %eax, %ebx // ebx = ebx*eax// ebx = ebx*eax
decl %eax
decl %eax //decrementa eax//decrementa eax
jmp L1
jmp L1 // pulo incondicional para L1// pulo incondicional para L1
L2: ret L2: ret
Intel x AT&T Intel x AT&T
- Exemplo: Ponto de entrada - Exemplo: Ponto de entrada
NASMNASM
section .data section .text global _start _start:
push epb mov ebp,esp push ebx push esi push edi
; código do seu programa pop edi
pop esi pop ebx
mov esp,ebp pop ebp
Intel x AT&T Intel x AT&T
- Exemplo: Ponto de entrada - Exemplo: Ponto de entrada
AT&T
.data
.globl main main:
pushl %epb
movl %ebp,%esp pushl %ebx
pushl %esi pushl %edi
; código do seu programa popl %edi
popl %esi popl %ebx
movl %esp,%ebp popl %ebp
Pilha e Argumentos de Pilha e Argumentos de
linha de comando linha de comando
Exemplo:Exemplo:
– ./programa infra software 677./programa infra software 677
PILHA PILHA
44
““programa”programa”
““infra”infra”
““software”software”
““677”677”
Pilha e Argumentos de Pilha e Argumentos de
linha de comando linha de comando
Exemplo:Exemplo:
– ./programa infra software 677./programa infra software 677
INTEL
INTEL AT&TAT&T O que é?O que é?
pop eax pop eax pop ebx pop ebx pop ecx pop ecx pop edx pop edx pop eax pop eax
pop %eax pop %eax pop %ebx pop %ebx pop %ecx pop %ecx pop %edx pop %edx pop %eax pop %eax
# de args
# de args
““programa”programa”
““infra”infra”
““software”software”
““677”677”
Gerando Código Assembly Gerando Código Assembly
Como gerar código assembly de um Como gerar código assembly de um programa escrito em C?
programa escrito em C?
– gcc -S nomeDoPrograma.cgcc -S nomeDoPrograma.c
Será gerado um arquivo assembly com o Será gerado um arquivo assembly com o nome “nomeDoPrograma.s”
nome “nomeDoPrograma.s”
Estratégia muito boa para se aprender Estratégia muito boa para se aprender assembly
assembly
– Construir programas em C e compilar com o Construir programas em C e compilar com o parâmetro “-S” para gerar o código “.s”
parâmetro “-S” para gerar o código “.s”
Simulando comandos C Simulando comandos C
- If-then-else - If-then-else
C
if (EAX == 'w') { writeFile();
} else {
doSomethingElse();
}
NASM
cmp eax, 'w'
jne skipWrite ; Se não, skip call writeFile
jmp outOfThisMess skipWrite:
call doSomethingElse outOfThisMess:
... ; resto do programa
Simulando comandos C Simulando comandos C
- If-then-else - If-then-else
C
if (EAX == 'w') { writeFile();
} else {
doSomethingElse();
}
AT&T
cmpl 'w‘, %eax
jne skipWrite ; Se não, skip call writeFile
jmp outOfThisMess skipWrite:
call doSomethingElse outOfThisMess:
... ; resto do programa
Simulando comandos C Simulando comandos C
- while - while
C
int i = 0;
while(i< 100){
i = i + 1;
}
NASM
mov eax, 0
whileLoop: mov ebx, 100 cmp eax, ebx
jge WhileTerminado inc eax
jmp WhileLoop WhileTerminado:
;resto do código
Simulando comandos C Simulando comandos C
- while - while
C
int i = 0;
while(i< 100){
i = i + 1;
}
AT&T
movl $0, %eax
whileLoop: movl $100, %ebx cmpl %ebx, %eax
jge WhileTerminado incl %eax
jmp WhileLoop WhileTerminado:
;resto do código
Assembly Inline Assembly Inline
- funções inline em C - funções inline em C
O que é inline function? O que é inline function?
– Uma forma de instruir o compilador a Uma forma de instruir o compilador a inserir o código de uma determinada inserir o código de uma determinada
função dentro do código de quem a função dentro do código de quem a
chama chama
Assembly Inline Assembly Inline
- funções inline em C - funções inline em C
Benefícios Benefícios
– Redução do overhead existente para a Redução do overhead existente para a chamada de uma função
chamada de uma função
– Possível simplificações em tempo de Possível simplificações em tempo de compilação, de forma que não
compilação, de forma que não
necessariamente todo o código da função necessariamente todo o código da função
inline precise ser incluído inline precise ser incluído
Assembly Inline Assembly Inline
- funções inline em C - funções inline em C
Desvantagens Desvantagens
– Possível aumento do tamanho do códigoPossível aumento do tamanho do código
Como usar? Como usar?
– Colocando a palavra chave “inline” na Colocando a palavra chave “inline” na declaração da função
declaração da função
Assembly Inline Assembly Inline
Rotinas assembly escritas como Rotinas assembly escritas como funções inline
funções inline
Características Características
– ConvenientesConvenientes – VelozesVelozes
– Amplamente utilizadas na programações Amplamente utilizadas na programações de sistemas
de sistemas
Assembly Inline Assembly Inline
Como declarar? Como declarar?
– asm("assembly code"); asm("assembly code");
Importância Importância
– Atua como interface entre funções Atua como interface entre funções assembly e os programas C que as assembly e os programas C que as
contêm contêm
– Atuação sobre operandos e produção de Atuação sobre operandos e produção de resultados visíveis para variáveis C
resultados visíveis para variáveis C
Assembly Inline Assembly Inline
Exemplo 1:Exemplo 1:
– Move o conteúdo de ecx para eax:Move o conteúdo de ecx para eax:
__asm__("movl %ecx, %eax"); __asm__("movl %ecx, %eax");
Exemplo 2:Exemplo 2:
– Move o conteúdo de ecx para o endereço da memória Move o conteúdo de ecx para o endereço da memória apontado por eax:
apontado por eax:
asm("movb %ecx, (%eax)");
asm("movb %ecx, (%eax)");
}}
– Observe nos dois exemplos acima a possibilidade de se utilizar Observe nos dois exemplos acima a possibilidade de se utilizar __asm__(“código”) ou asm(“código”)
__asm__(“código”) ou asm(“código”)
Assembly Inline Assembly Inline
No caso de mais de uma instrução: No caso de mais de uma instrução:
– Escreve-se uma por linhaEscreve-se uma por linha – Entre aspasEntre aspas
– Com o sufixo “\n\t” ao final da instruçãoCom o sufixo “\n\t” ao final da instrução – Isso se deve ao fato de que GCC envia Isso se deve ao fato de que GCC envia
cada instrução como uma String ao GNU cada instrução como uma String ao GNU
Assembler Assembler
Assembly Inline Assembly Inline
Exemplo 3:Exemplo 3:
#include <stdio.h>
#include <stdio.h>
int main() int main()
{{
__asm__ (
__asm__ ( "movl %eax, %ebx\n\t“"movl %eax, %ebx\n\t“
"movl $56, %esi\n\t“
"movl $56, %esi\n\t“
"movl %ecx, $label(%edx,%ebx,$4)\n\t"
"movl %ecx, $label(%edx,%ebx,$4)\n\t"
"movb %ah, (%ebx)");
"movb %ah, (%ebx)");
}}
Assembly Inline Assembly Inline
Exemplo 4Exemplo 4::
#include <stdio.h>
#include <stdio.h>
int main() int main() {{
__asm__("
__asm__("
movlmovl $1,%eax$1,%eax // SYS_exit// SYS_exit xor %ebx,%ebx
xor %ebx,%ebx intint $0x80 $0x80
");
");
}}