assembly – aula 2
DESCRIPTION
Hugo Calazans [email protected]. ASSEMBLY – aula 2. Roteiro. 1- Recapitulação (Intel x AT&T) 2- Pilha e command line arguments 3- Procedimentos 4- Simulando alguns comandos C 5- Assembly inline 6- Linux Man Pages. Intel x AT&T - recapitulação. Intel x AT&T - recapitulação. - PowerPoint PPT PresentationTRANSCRIPT
RoteiroRoteiro
1- Recapitulação (Intel x AT&T)1- Recapitulação (Intel x AT&T)
2- Pilha e command line arguments2- Pilha e command line arguments
3- Procedimentos3- Procedimentos
4- Simulando alguns comandos C4- Simulando alguns comandos C
5- Assembly inline5- Assembly inline
6- Linux Man Pages6- Linux Man Pages
Intel x AT&TIntel x AT&T- recapitulação- recapitulação
Intel Code AT&T Codemov eax,1
mov ebx,0ffh
int 80h
mov ebx, eax
mov eax,[ecx]
mov eax,[ebx+3]
mov eax,[ebx+20h]
add eax,[ebx+ecx*2h]
lea eax,[ebx+ecx]
sub eax,[ebx+ecx*4h-20h]
movl $1,%eax
movl $0xff,%ebx
int $0x80
movl %eax, %ebx
movl (%ecx),%eax
movl 3(%ebx),%eax
movl 0x20(%ebx),%eax
addl (%ebx,%ecx,0x2),%eax
leal (%ebx,%ecx),%eax
subl -0x20(%ebx,%ecx,0x4),%eax
Intel x AT&TIntel x AT&T- recapitulação- recapitulação
Diferenças:Diferenças:1- Ordenação entre source e destination1- Ordenação entre source e destination
2- Nome dos registradores (prefixação)2- Nome dos registradores (prefixação)
3- Operandos imediatos (prefixação)3- Operandos imediatos (prefixação)
4- Menção feita ao tamanho dos 4- Menção feita ao tamanho dos operandosoperandos
5- Manipulação de operandos na 5- Manipulação de operandos na memóriamemória
Intel x AT&TIntel x AT&T- Exemplo: Fatorial- Exemplo: Fatorial CC
int fatorial (int numero) {int fatorial (int numero) {
int fat = 1;int fat = 1;
if (numero <= 1)if (numero <= 1)
return 1;return 1;
fat = numero * fatorial (numero - 1);fat = numero * fatorial (numero - 1);
return fat;return fat;
}}
Intel x AT&TIntel x AT&T- Exemplo: Fatorial- Exemplo: Fatorial IntelIntel
mov eax, 5mov eax, 5mov ebx, 1mov ebx, 1
L1:L1: cmp eax, 0cmp eax, 0 //compara 0 com o valor em //compara 0 com o valor em eaxeax
je L2je L2 //pula p/ L2 se 0==eax (je – pula se //pula p/ L2 se 0==eax (je – pula se igual)igual)
imul ebx, eaximul ebx, eax // ebx = ebx*eax// ebx = ebx*eax
dec eaxdec eax //decrementa eax//decrementa eax
jmp L1jmp L1 // pulo incondicional para // pulo incondicional para L1L1
L2: ret L2: ret
Intel x AT&TIntel x AT&T- Exemplo: Fatorial- Exemplo: Fatorial AT&TAT&T
movl $5, %eaxmovl $5, %eaxmovl $1, %ebxmovl $1, %ebx
L1:L1: cmpl $0, %eaxcmpl $0, %eax //compara 0 com o valor em //compara 0 com o valor em eaxeax
je L2je L2 //pula p/ L2 se 0==eax (je – pula se //pula p/ L2 se 0==eax (je – pula se igual)igual)
imull %eax, %ebximull %eax, %ebx // ebx = ebx*eax// ebx = ebx*eax
decl %eaxdecl %eax //decrementa eax//decrementa eax
jmp L1jmp L1 // pulo incondicional para L1// pulo incondicional para L1
L2: ret L2: ret
Intel x AT&TIntel x AT&T- Exemplo: Ponto de - Exemplo: Ponto de entradaentrada NASMNASM
section .data
section .text global _start
_start: push epbmov ebp,esppush ebxpush esipush edi
; código do seu programa
pop edipop esipop ebxmov esp,ebppop ebp
Intel x AT&TIntel x AT&T- Exemplo: Ponto de - Exemplo: Ponto de entradaentrada AT&T
.data
.globl main
main: pushl %epbmovl %ebp,%esppushl %ebxpushl %esipushl %edi
; código do seu programa
popl %edipopl %esipopl %ebxmovl %esp,
%ebppopl %ebp
Pilha e Argumentos de Pilha e Argumentos de linha de comandolinha de comando Exemplo:Exemplo:
– ./programa infra software 677./programa infra software 677
PILHA
4
“programa”
“infra”
“software”
“677”
Pilha e Argumentos de Pilha e Argumentos de linha de comandolinha de comando Exemplo:Exemplo:
– ./programa infra software 677./programa infra software 677
INTEL AT&T O que é?
pop eax
pop ebx
pop ecx
pop edx
pop eax
pop %eax
pop %ebx
pop %ecx
pop %edx
pop %eax
# de args
“programa”
“infra”
“software”
“677”
Procedimentos?Procedimentos?
Diferentemente do TASM, NASM não Diferentemente do TASM, NASM não possui o conceito de procedimentopossui o conceito de procedimento– Tudo é Label!Tudo é Label!
Nada de keywords "proc" ou "endp"Nada de keywords "proc" ou "endp"– basta colocar uma labelbasta colocar uma label
Boa práticaBoa prática– comentários delimitando o bloco de comentários delimitando o bloco de
códigocódigo
Procedimentos?Procedimentos?No DOS, sim!No DOS, sim!
DOS
proc fileWrite:mov ah, 40hmov bx, [filehandle]mov cl, [stuffLen]mov dx, offset
stuffToWriteint 21hret
endp fileWrite
Procedimentos?Procedimentos?No Linux, não. Labels!No Linux, não. Labels!
INTEL
fileWrite:mov eax,4mov ebx, [filedesc]mov ecx,
stuffToWritemov edx, [stuffLen]int 80hret
; endp fileWrite
AT&T
fileWrite:movl $4, %eaxmovl ($filedesc),
%ebxmovl $stuffToWrite,
%ecxmovl ($stuffLen),
%edxint $0x80ret
; endp fileWrite
Gerando Código Gerando Código AssemblyAssembly 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 Será gerado um arquivo assembly com o nome “nomeDoPrograma.s”o nome “nomeDoPrograma.s”
Estratégia muito boa para se aprender Estratégia muito boa para se aprender assemblyassembly– Construir programas em C e compilar com Construir programas em C e compilar com
o parâmetro “-S” para gerar o código “.s”o parâmetro “-S” para gerar o código “.s”
Simulando comandos CSimulando 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 writeFilejmp outOfThisMess
skipWrite:call doSomethingElse
outOfThisMess:... ; resto do
programa
Simulando comandos CSimulando comandos C- If-then-else- If-then-else
C
if (EAX == 'w') {writeFile();
} else {doSomethingElse();
}
AT&T
cmpl 'w‘, %eaxjne skipWrite ; Se não,
skip
call writeFilejmp outOfThisMess
skipWrite:call doSomethingElse
outOfThisMess:... ; resto do
programa
Simulando comandos CSimulando comandos C- while- while
C
int i = 0;
while(i< 100){i = i + 1;
}
NASM
mov eax, 0whileLoop: mov ebx, 100
cmp eax, ebxjge WhileTerminadoinc eaxjmp WhileLoop
WhileTerminado:;resto do código
Simulando comandos CSimulando comandos C- while- while
C
int i = 0;
while(i< 100){i = i + 1;
}
AT&T
movl $0, %eaxwhileLoop: movl $100,
%ebxcmpl %ebx, %eax
jge WhileTerminadoincl %eaxjmp WhileLoop
WhileTerminado:;resto do código
Assembly InlineAssembly 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 Uma forma de instruir o compilador
a inserir o código de uma a inserir o código de uma determinada função dentro do determinada função dentro do código de quem a chamacódigo de quem a chama
Assembly InlineAssembly Inline- funções inline em C- funções inline em C
BenefíciosBenefícios– Redução do overhead existente para Redução do overhead existente para
a chamada de uma funçãoa 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 necessariamente todo o código da função inline precise ser incluídofunção inline precise ser incluído
Assembly InlineAssembly Inline- funções inline em C- funções inline em C
DesvantagensDesvantagens– Possível aumento do tamanho do Possível aumento do tamanho do
códigocódigo Como usar?Como usar?
– Colocando a palavra chave “inline” Colocando a palavra chave “inline” na declaração da funçãona declaração da função
Assembly InlineAssembly Inline
Rotinas assembly escritas como Rotinas assembly escritas como funções inlinefunções inline
CaracterísticasCaracterísticas– ConvenientesConvenientes– VelozesVelozes– Amplamente utilizadas na Amplamente utilizadas na
programações de sistemasprogramações de sistemas
Assembly InlineAssembly Inline
Como declarar?Como declarar?– asm("assembly code"); asm("assembly code");
ImportânciaImportâ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êmcontêm
– Atuação sobre operandos e produção Atuação sobre operandos e produção de resultados visíveis para variáveis de resultados visíveis para variáveis C C
Assembly InlineAssembly 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 InlineAssembly 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 Com o sufixo “\n\t” ao final da
instruçãoinstrução– Isso se deve ao fato de que GCC Isso se deve ao fato de que GCC
envia cada instrução como uma envia cada instrução como uma String ao GNU AssemblerString ao GNU Assembler
Assembly InlineAssembly 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,"movl %ecx, $label(%edx,%ebx,
$4)\n\t" $4)\n\t" "movb %ah, (%ebx)");"movb %ah, (%ebx)");}}
Assembly InlineAssembly Inline
Exemplo 4Exemplo 4::
#include <stdio.h>#include <stdio.h>int main()int main()
{{__asm__("__asm__("
movlmovl $1,%eax$1,%eax // SYS_exit// SYS_exitxor %ebx,%ebxxor %ebx,%ebx
intint $0x80 $0x80");");
}}
Linux Man PagesLinux Man Pages
O que são?O que são?– documentação extensiva presente na documentação extensiva presente na
maior parte dos SOs da família UNIXmaior parte dos SOs da família UNIX ComandoComando
– man <page_name>man <page_name> Ótima referência para system callsÓtima referência para system calls
– Section 2Section 2 Executadas a partir do serviço de interr Executadas a partir do serviço de interr
80h80h
Linux Man PagesLinux Man Pages- Organização típica- Organização típica
1. General Commands1. General Commands
2. System Calls2. System Calls
3. Subroutines3. Subroutines
4. Special Files4. Special Files
5. File Formats5. File Formats
6. Games and screensavers6. Games and screensavers
7. Macros and Conventions7. Macros and Conventions
8. Maintenence Commands8. Maintenence Commands
Linux Man PagesLinux Man Pages
A partir do terminal do unix:A partir do terminal do unix:– Exemplo: digite “man 2 write”Exemplo: digite “man 2 write”
Online:Online:– http://www.linuxmanpages.com/http://www.linuxmanpages.com/– http://man.he.net/http://man.he.net/– http://www.die.net/doc/linux/man/http://www.die.net/doc/linux/man/
Assembly – Assembly – ReferênciasReferências
www.cin.ufpe.br/~htcrs/if677/www.cin.ufpe.br/~htcrs/if677/
ExercícioExercício
Escreva programas em C que Escreva programas em C que implementem:implementem:– LoopsLoops– Impressão de String na telaImpressão de String na tela
Gere o código assembly Gere o código assembly correspondente a esses correspondente a esses programasprogramas
Analise o código geradoAnalise o código gerado