Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Hugo Calazans André Ricardo
ASSEMBLY – aula 2 Hugo Calazans André Ricardo
2
Roteiro 1- Intel x AT&T 2- Pilha e command line arguments
3- Procedimentos 4- Simulando alguns comandos C 5- Assembly inline 6- Criando um projeto C/C++ no eclipse 7- Exemplos de código c/c++ 8- Exemplos de código Assembly inline 9- Linux Man Pages 10- Referências
3
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
4
Intel x AT&T 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
5
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; }
6
Intel x AT&T - Exemplo: Fatorial
.globl main main: 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
7
Intel x AT&T - Exemplo: Fatorial
.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
8
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
9
Intel x AT&T - Exemplo: Ponto de entrada
.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 linha de comando
Exemplo: ./programa infra software 677 PILHA 4 “programa” “infra” “software” “677”
11
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 %ebx pop %ecx pop %edx # de args “programa” “infra” “software” “677”
12
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
13
Procedimentos? No DOS, sim!
proc fileWrite: mov ah, 40h mov bx, [filehandle] mov cl, [stuffLen] mov dx, offset stuffToWrite int 21h ret endp fileWrite
14
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
15
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”
16
Simulando comandos C - If-then-else
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
17
Simulando comandos C - If-then-else
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
18
Simulando comandos C - while
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
19
Simulando comandos C - while
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
20
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
21
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
22
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
23
Assembly Inline Rotinas assembly escritas como funções inline
Características Convenientes Velozes Amplamente utilizadas na programações de sistemas
24
Assembly Inline Como declarar? Importância asm("assembly code");
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
25
Assembly Inline Exemplo 1: Exemplo 2: __asm__("movl %ecx, %eax");
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”)
26
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
27
Assembly Inline Exemplo 3: int main() {
#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)"); }
28
Assembly Inline Exemplo 4: #include <stdio.h> int main()
{ __asm__(" movl $1,%eax // SYS_exit xor %ebx,%ebx int $0x80 "); }
29
Criando um projeto C/C++ no eclipse
30
Exemplo Código C/C++
31
Executando a aplicação
32
Hello World usando Interrupções
33
Chamando funções externas
34
Chamando funções externas (múltiplos parametros)
35
Chamando funções externas (múltiplos parametros)
36
Obtendo o tempo de sistema
37
Criando e Modificando Arquivos
38
Linux Man Pages O que são? Comando Ótima referência para system calls
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
39
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
40
Linux Man Pages A partir do terminal do unix: Online:
Exemplo: digite “man 2 write” Online:
41
Assembly – Referências
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.