armando gon alves ciro ceissler
Download
Skip this Video
Download Presentation
ASSEMBLY – aula 2

Loading in 2 Seconds...

play fullscreen
1 / 31

ASSEMBLY – aula 2 - PowerPoint PPT Presentation


  • 100 Views
  • Uploaded on

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:

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'ASSEMBLY – aula 2' - hesper


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
roteiro
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
Intel x AT&T
  • Diferenças:

1- Ordenação entre source e destination

2- Nome dos registradores

3- Operandos imediatos (immediate)

4- Tamanho dos operandos

5- Operandos na memória

intel x at t exemplo fatorial
Intel x AT&T- Exemplo: Fatorial
  • C

int fatorial (int numero) {

int y = 1;

if (numero <= 1)

return 1;

y = numero * fatorial (numero - 1);

return y;

}

intel x at t exemplo fatorial1
Intel x AT&T- Exemplo: Fatorial
  • Intel

segment .data

segment .bss

segment .text

global _asm_main

_asm_main:

moveax, 5

movebx, 1

L1:

cmpeax, 0

je L2

imulebx, eax

deceax

jmp L1

L2: ret

intel x at t exemplo fatorial2
Intel x AT&T- Exemplo: Fatorial
  • AT&T

.globl main

main:

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

intel x at t exemplo ponto de entrada
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

Intel x AT&T- Exemplo: Ponto de entrada
intel x at t exemplo ponto de entrada1
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

Intel x AT&T- Exemplo: Ponto de entrada
pilha e argumentos de linha de comando
Pilha e Argumentos de linha de comando
  • Exemplo:
    • ./programa infra software 677
pilha e argumentos de linha de comando1
Pilha e Argumentos de linha de comando
  • Exemplo:
    • ./programa infra software 677
gerando c digo assembly
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”
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

Simulando comandos C- If-then-else
simulando comandos c if then else1
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

Simulando comandos C- If-then-else
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

Simulando comandos C- while
simulando comandos c while1
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

Simulando comandos C- while
assembly inline fun es inline em c
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
assembly inline fun es inline em c1
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
assembly inline fun es inline em c2
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
assembly inline
Assembly Inline
  • Rotinas assembly escritas como funções inline
  • Características
    • Convenientes
    • Velozes
    • Amplamente utilizadas na programações de sistemas
assembly inline1
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
assembly inline2
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”)
assembly inline3
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
assembly inline4
Assembly Inline
  • Exemplo 3:

#include

int main()

{

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

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

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

}

assembly inline5
Assembly Inline
  • Exemplo 4:

#include int main()

{ __asm__("

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

int $0x80 ");

}

ad