ASSEMBLY – aula 2

31
ASSEMBLY – aula 2 ASSEMBLY – aula 2 Armando Gonçalves Armando Gonçalves Ciro Ceissler Ciro Ceissler

description

Armando Gonçalves Ciro Ceissler. ASSEMBLY – aula 2. Roteiro. 1- Intel x AT&T 2- Pilha e command line arguments 4- Simulando alguns comandos C 5- Assembly inline 7- Exemplos de código c/c++ 8- Exemplos de código Assembly inline. Intel x AT&T. Diferenças: - PowerPoint PPT Presentation

Transcript of ASSEMBLY – aula 2

Page 1: ASSEMBLY – aula 2

ASSEMBLY – aula 2ASSEMBLY – aula 2

Armando GonçalvesArmando Gonçalves

Ciro CeisslerCiro Ceissler

Page 2: ASSEMBLY – aula 2

RoteiroRoteiro

1- Intel x AT&T1- Intel x AT&T

2- Pilha e command line arguments2- Pilha e command line arguments

4- Simulando alguns comandos C4- Simulando alguns comandos C

5- Assembly inline5- Assembly inline

7- Exemplos de código c/c++7- Exemplos de código c/c++

8- Exemplos de código Assembly inline8- Exemplos de código Assembly inline

Page 3: ASSEMBLY – aula 2

Intel x AT&TIntel x AT&T

Diferenças:Diferenças:1- Ordenação entre source e 1- Ordenação entre source e

destinationdestination

2- Nome dos registradores2- Nome dos registradores

3- Operandos imediatos (immediate)3- Operandos imediatos (immediate)

4- Tamanho dos operandos4- Tamanho dos operandos

5- Operandos na memória5- Operandos na memória

Page 4: ASSEMBLY – aula 2

Intel x AT&TIntel x AT&T

Intel CodeIntel Code AT&T CodeAT&T Codemov eax,1mov eax,1

mov ebx,0ffhmov ebx,0ffh

int 80hint 80h

mov ebx, eaxmov 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,%eaxmovl $1,%eax

movl $0xff,%ebxmovl $0xff,%ebx

int $0x80int $0x80

movl %eax, %ebxmovl %eax, %ebx

movl (%ecx),%eaxmovl (%ecx),%eax

movl 3(%ebx),%eaxmovl 3(%ebx),%eax

movl 0x20(%ebx),%eaxmovl 0x20(%ebx),%eax

addl (%ebx,%ecx,0x2),%eaxaddl (%ebx,%ecx,0x2),%eax

leal (%ebx,%ecx),%eaxleal (%ebx,%ecx),%eax

subl -0x20(%ebx,%ecx,0x4),subl -0x20(%ebx,%ecx,0x4),%eax%eax

Page 5: ASSEMBLY – aula 2

Intel x AT&TIntel 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;

}}

Page 6: ASSEMBLY – aula 2

Intel x AT&TIntel x AT&T- Exemplo: Fatorial- Exemplo: Fatorial IntelIntel segment .datasegment .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 L2je L2

imul ebx, eaximul ebx, eax

dec eaxdec eax

jmp L1jmp L1

L2: ret L2: ret

Page 7: ASSEMBLY – aula 2

Intel x AT&TIntel x AT&T- Exemplo: Fatorial- Exemplo: Fatorial AT&TAT&T

.globl main.globl mainmain:main:

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

Page 8: ASSEMBLY – aula 2

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

Page 9: ASSEMBLY – aula 2

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

Page 10: ASSEMBLY – aula 2

Pilha e Argumentos de Pilha e Argumentos de linha de comandolinha de comando Exemplo:Exemplo:

– ./programa infra software 677./programa infra software 677

PILHAPILHA

44

““programprograma”a”

““infra”infra”

““softwaresoftware””

““677”677”

Page 11: ASSEMBLY – aula 2

Pilha e Argumentos de Pilha e Argumentos de linha de comandolinha de comando Exemplo:Exemplo:

– ./programa infra software 677./programa infra software 677

INTELINTEL AT&TAT&T O que é?O que é?

pop eaxpop eax

pop ebxpop ebx

pop ecxpop ecx

pop edxpop edx

pop eaxpop eax

pop %eaxpop %eax

pop %ebxpop %ebx

pop %ecxpop %ecx

pop %edxpop %edx

pop %eaxpop %eax

# de args# de args

““programprograma”a”

““infra”infra”

““softwaresoftware””

““677”677”

Page 12: ASSEMBLY – aula 2

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”

Page 13: ASSEMBLY – aula 2

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

Page 14: ASSEMBLY – aula 2

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

Page 15: ASSEMBLY – aula 2

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

Page 16: ASSEMBLY – aula 2

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

Page 17: ASSEMBLY – aula 2

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

Page 18: ASSEMBLY – aula 2

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

Page 19: ASSEMBLY – aula 2

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

Page 20: ASSEMBLY – aula 2

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

Page 21: ASSEMBLY – aula 2

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

Page 22: ASSEMBLY – aula 2

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”)

Page 23: ASSEMBLY – aula 2

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

Page 24: ASSEMBLY – aula 2

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)");}}

Page 25: ASSEMBLY – aula 2

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");");

}}

Page 26: ASSEMBLY – aula 2

Hello World usando Hello World usando InterrupçõesInterrupções

Page 27: ASSEMBLY – aula 2

Chamando funções Chamando funções externasexternas

Page 28: ASSEMBLY – aula 2

Chamando funções externas Chamando funções externas (múltiplos parametros)(múltiplos parametros)

Page 29: ASSEMBLY – aula 2

Chamando funções externas Chamando funções externas (múltiplos parametros)(múltiplos parametros)

Page 30: ASSEMBLY – aula 2

Obtendo o tempo de Obtendo o tempo de sistemasistema

Page 31: ASSEMBLY – aula 2

Criando e Modificando Criando e Modificando ArquivosArquivos