• Nenhum resultado encontrado

ASSEMBLY – aula 2 ASSEMBLY – aula 2

N/A
N/A
Protected

Academic year: 2022

Share "ASSEMBLY – aula 2 ASSEMBLY – aula 2"

Copied!
31
0
0

Texto

(1)

ASSEMBLY – aula 2 ASSEMBLY – aula 2

Armando Gonçalves Armando Gonçalves

Ciro Ceissler

Ciro Ceissler

(2)

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

(3)

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

(4)

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

(5)

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;

}}

(6)

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

(7)

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

(8)

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

(9)

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

(10)

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”

(11)

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”

(12)

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”

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

}}

(25)

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

");

");

}}

(26)

Hello World usando Hello World usando

Interrupções

Interrupções

(27)

Chamando funções Chamando funções

externas

externas

(28)

Chamando funções externas Chamando funções externas

(múltiplos parametros)

(múltiplos parametros)

(29)

Chamando funções externas Chamando funções externas

(múltiplos parametros)

(múltiplos parametros)

(30)

Obtendo o tempo de Obtendo o tempo de

sistema

sistema

(31)

Criando e Modificando Criando e Modificando

Arquivos

Arquivos

Referências

Documentos relacionados

Viabilizar a capacitação para suspeição do câncer infantojuvenil em todos os pontos de atenção da rede municipal (Atenção Primária, Rede de Urgência e Emergência,

Taxas da Associação de Proprietários de Bens Imóveis (HOA, em Inglês), cujo pagamento é realizado mensalmente e inclui seguro sobre a gestão e manutenção de áreas

Diante da hipótese que o NDVI reflete o desenvolvimento e, portanto, o uso de água por uma cultura agrícola, o objetivo desse trabalho é estimar o coeficiente basal de cultivos

Para concluir, e a pesar das limitações de uma descrição tão sucinta sobre um contexto tão complexo como a que trago aqui, considero urgente abrir um diálogo que compartilhe

16. Leia as alternativas e assinale a incorreta, conforme estabelecido no Regime Jurídico Único dos Servidores Municipais de São Jerônimo/RS. a) A frequência do

a) Pagar pontualmente os valores que sejam de sua responsabilidade, cabendo-lhe, também, o pagamento de tributos que recaiam sobre os serviços que prestar. b) Manter

Devido a características físicas da escola, o conselho pedagógico recomenta que o número de alunos por turma deve ser de 26 (vinte e seis), com a possibilidade de em casos

Parágrafo Quarto: A cada 06 (seis) períodos de apuração de ponto, considerando-se que cada período de apuração de ponto vai do dia 16 (dezesseis) de determinado mês até o dia