ASSEMBLY – aula 2 Hugo Calazans htcrs@cin.ufpe.br.

Post on 07-Apr-2016

223 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

Transcript

ASSEMBLY – aula 2ASSEMBLY – aula 2Hugo CalazansHugo Calazans

htcrs@cin.ufpe.brhtcrs@cin.ufpe.br

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 arguments3- Procedimentos3- Procedimentos4- Simulando alguns comandos C4- Simulando alguns comandos C5- Assembly inline5- Assembly inline6- Linux Man Pages6- Linux Man Pages

Intel x AT&TIntel x AT&T- recapitulação- recapitulação

Intel Code AT&T Codemov eax,1mov ebx,0ffhint 80hmov ebx, eaxmov 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,%eaxmovl $0xff,%ebxint $0x80movl %eax, %ebxmovl (%ecx),%eaxmovl 3(%ebx),%eaxmovl 0x20(%ebx),%eaxaddl (%ebx,%ecx,0x2),%eaxleal (%ebx,%ecx),%eaxsubl -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 destination2- 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

operandosoperandos5- Manipulação de operandos na memória5- Manipulação de operandos na memó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 eaxeaxje L2je L2 //pula p/ L2 se 0==eax (je – pula se igual)//pula p/ L2 se 0==eax (je – pula se igual)imul ebx, eaximul ebx, eax // ebx = ebx*eax// ebx = ebx*eaxdec eaxdec eax //decrementa eax//decrementa eaxjmp L1jmp L1 // pulo incondicional para L1// pulo incondicional para L1

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 eaxeaxje L2je L2 //pula p/ L2 se 0==eax (je – pula se igual)//pula p/ L2 se 0==eax (je – pula se igual)imull %eax, %ebximull %eax, %ebx // ebx = ebx*eax// ebx = ebx*eaxdecl %eaxdecl %eax //decrementa eax//decrementa eaxjmp 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

PILHA4

“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 eaxpop ebxpop ecxpop edxpop eax

pop %eaxpop %ebxpop %ecxpop %edxpop %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();

}

NASMcmp 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&Tcmpl '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, %eaxjge 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 C de resultados visíveis para variáveis 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,%ebxintint $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 80hExecutadas a partir do serviço de interr 80h

Linux Man PagesLinux Man Pages- Organização típica- Organização típica1. General Commands1. General Commands2. System Calls2. System Calls3. Subroutines3. Subroutines4. Special Files4. Special Files5. File Formats5. File Formats6. Games and screensavers6. Games and screensavers7. Macros and Conventions7. Macros and Conventions8. 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

top related