ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os...

29
ASSEMBLY – aula 2

Transcript of ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os...

Page 1: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

ASSEMBLY – aula 2

Page 2: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - recapitulação

Intel Code AT&T Code mov 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

Page 3: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - recapitulação

�  Diferenças: 1- Ordenação entre source e destination 2- Nome dos registradores (prefixação) 3- Operandos imediatos (prefixação) 4- Menção feita ao tamanho dos operandos 5- Manipulação de operandos na memória

Page 4: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - Exemplo: Fatorial

�  C

int fatorial (int numero) {

int fat = 1;

if (numero <= 1)

return 1;

fat = numero * fatorial (numero - 1);

return fat;

}

Page 5: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - Exemplo: Fatorial

�  Intel

mov eax, 5

mov ebx, 1

L1: cmp eax, 0 //compara 0 com o valor em eax

je L2 //pula p/ L2 se 0==eax (je – pula se igual)

imul ebx, eax // ebx = ebx*eax

dec eax //decrementa eax

jmp L1 // pulo incondicional para L1

L2: ret

Page 6: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - Exemplo: Fatorial

�  AT&T

movl $5, %eax

movl $1, %ebx

L1: cmpl $0, %eax //compara 0 com o valor em eax

je L2 //pula p/ L2 se 0==eax (je – pula se igual)

imull %eax, %ebx // ebx = ebx*eax

decl %eax //decrementa eax

jmp L1 // pulo incondicional para L1

L2: ret

Page 7: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - Exemplo: Ponto de entrada

n  NASM

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

Page 8: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Intel x AT&T - Exemplo: Ponto de entrada

n  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

Page 9: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Pilha e Argumentos de linha de comando � Exemplo:

�  ./programa infra software 677

PILHA 4

“programa” “infra”

“software” “677”

Page 10: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Pilha e Argumentos de linha de comando � Exemplo:

�  ./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”

Page 11: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Procedimentos? �  Diferentemente do TASM, NASM não possui o conceito de

procedimento �  Tudo é Label!

�  Nada de keywords "proc" ou "endp" �  basta colocar uma label

�  Boa prática �  comentários delimitando o bloco de código

Page 12: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Procedimentos? No DOS, sim!

DOS

proc fileWrite: mov ah, 40h mov bx, [filehandle] mov cl, [stuffLen] mov dx, offset

stuffToWrite int 21h ret

endp fileWrite

Page 13: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Procedimentos? No Linux, não. Labels!

INTEL

fileWrite: mov eax,4 mov ebx, [filedesc] mov ecx, stuffToWrite mov edx, [stuffLen] int 80h ret

; endp fileWrite

AT&T fileWrite:

movl $4, %eax movl

($filedesc), %ebx movl $stuffToWrite,

%ecx movl ($stuffLen), %edx int $0x80 ret

; endp fileWrite

Page 14: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Gerando Código Assembly

� Como gerar código assembly de um programa escrito em C? �  gcc -S nomeDoPrograma.c

� Será gerado um arquivo assembly com o nome “nomeDoPrograma.s”

� Estratégia muito boa para se aprender assembly �  Construir programas em C e compilar com o

parâmetro “-S” para gerar o código “.s”

Page 15: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Simulando comandos C - 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

Page 16: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Simulando comandos C - 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

Page 17: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Simulando comandos C - 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

Page 18: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Simulando comandos C - 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

Page 19: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline - funções inline em C

�  O que é inline function? �  Uma forma de instruir o compilador a inserir o código de

uma determinada função dentro do código de quem a chama

Page 20: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline - funções inline em C

�  Benefícios �  Redução do overhead existente para a chamada de uma

função �  Possível simplificações em tempo de compilação, de forma

que não necessariamente todo o código da função inline precise ser incluído

Page 21: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline - funções inline em C

�  Desvantagens �  Possível aumento do tamanho do código

�  Como usar? �  Colocando a palavra chave “inline” na declaração da

função

Page 22: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline

�  Rotinas assembly escritas como funções inline

�  Características �  Convenientes �  Velozes �  Amplamente utilizadas na programações de sistemas

Page 23: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline

�  Como declarar? �  asm("assembly code");

�  Importância �  Atua como interface entre funções assembly e os

programas C que as contêm �  Atuação sobre operandos e produção de resultados visíveis

para variáveis C

Page 24: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline

� Exemplo 1: �  Move o conteúdo de ecx para eax:

__asm__("movl %ecx, %eax");

� Exemplo 2: �  Move o conteúdo de ecx para o endereço da memória

apontado por eax:

asm("movb %ecx, (%eax)");

}

�  Observe nos dois exemplos acima a possibilidade de se utilizar __asm__(“código”) ou asm(“código”)

Page 25: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline

�  No caso de mais de uma instrução: �  Escreve-se uma por linha �  Entre aspas �  Com o sufixo “\n\t” ao final da instrução �  Isso se deve ao fato de que GCC envia cada instrução como

uma String ao GNU Assembler

Page 26: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline

� Exemplo 3:

#include <stdio.h>

int main()

{

__asm__ ( "movl %eax, %ebx\n\t“

"movl $56, %esi\n\t“

"movl %ecx, $label(%edx,%ebx,$4)\n\t" "movb %ah, (%ebx)");

}

Page 27: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Assembly Inline

n Exemplo 4:

#include <stdio.h> int main()

{ __asm__("

movl $1,%eax // SYS_exit xor %ebx,%ebx

int $0x80 ");

}

Page 28: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Linux Man Pages

�  O que são? �  documentação extensiva presente na maior parte dos SOs

da família UNIX

�  Comando �  man <page_name>

�  Ótima referência para system calls �  Section 2

�  Executadas a partir do serviço de interr 80h

Page 29: ASSEMBLY – aula 2 - Adriano Maranhão · Atua como interface entre funções assembly e os programas C ... Observe nos dois exemplos acima a possibilidade de se ... Assembly Inline

Linux Man Pages - Organização típica

1. General Commands 2. System Calls 3. Subroutines 4. Special Files 5. File Formats 6. Games and screensavers 7. Macros and Conventions 8. Maintenence Commands