Armando gon alves ciro ceissler
Download
1 / 31

ASSEMBLY – aula 2 - PowerPoint PPT Presentation


  • 95 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
Armando gon alves ciro ceissler

Armando Gonçalves

CiroCeissler

ASSEMBLY – aula 2


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

    }


Assembly inline5
Assembly Inline

  • Exemplo 4:

    #include <stdio.h> int main()

    { __asm__("

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

    int $0x80 ");

    }








ad