ASSEMBLY aula 2 Hugo Calazans Andr Ricardo Roteiro
ASSEMBLY – aula 2 Hugo Calazans André Ricardo
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
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 Intel Code AT&T Code mov eax, 1 movl $1, %eax mov ebx, 0 ffh movl $0 xff, %ebx int 80 h int $0 x 80 mov ebx, eax movl %eax, %ebx mov eax, [ecx] movl (%ecx), %eax mov eax, [ebx+ 3] movl 3(%ebx), %eax mov eax, [ebx+20 h] movl 0 x 20(%ebx), %eax add eax, [ebx+ecx*2 h] addl (%ebx, %ecx, 0 x 2), %eax lea eax, [ebx+ecx] leal (%ebx, %ecx), %eax sub eax, [ebx+ecx*4 h-20 h] subl -0 x 20(%ebx, %ecx, 0 x 4), %eax
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: Fatorial Intel . globl main: mov eax, 5 mov ebx, 1 L 1: cmp eax, 0 je L 2 imul ebx, eax dec eax jmp L 1 L 2: ret //compara 0 com o valor em eax //pula p/ L 2 se 0==eax (je – pula se igual) // ebx = ebx*eax //decrementa eax // pulo incondicional para L 1
Intel x AT&T - Exemplo: Fatorial AT&T . globl main: movl $5, %eax movl $1, %ebx L 1: cmpl $0, %eax //compara 0 com o valor em eax je L 2 //pula p/ L 2 se 0==eax (je – pula se igual) imull %eax, %ebx // ebx = ebx*eax decl %eax //decrementa eax jmp L 1 // pulo incondicional para L 1 L 2: ret
Intel x AT&T - Exemplo: Ponto de entrada NASM section. data section. text global _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 AT&T . data. globl 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
Pilha e Argumentos de linha de comando Exemplo: –. /programa infra software 677 PILHA 4 “programa” “infra” “software” “ 677”
Pilha e Argumentos de linha de comando Exemplo: –. /programa infra software 677 INTEL pop eax pop ebx pop ecx pop edx pop eax AT&T pop %eax pop %ebx pop %ecx pop %edx pop %eax O que é? # de args “programa” “infra” “software” “ 677”
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
Procedimentos? No DOS, sim! DOS proc file. Write: mov ah, 40 h mov bx, [filehandle] mov cl, [stuff. Len] mov dx, offset stuff. To. Write int 21 h ret endp file. Write
Procedimentos? No Linux, não. Labels! INTEL file. Write: mov eax, 4 mov ebx, [filedesc] mov ecx, stuff. To. Write mov edx, [stuff. Len] int 80 h ret ; endp file. Write AT&T file. Write: movl $4, %eax movl ($filedesc), %ebx movl $stuff. To. Write, %ecx movl ($stuff. Len), %edx int $0 x 80 ret ; endp file. Write
Gerando Código Assembly Como gerar código assembly de um programa escrito em C? – gcc -S nome. Do. Programa. c Será gerado um arquivo assembly com o nome “nome. Do. Programa. 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') { write. File(); } else { do. Something. Else(); } NASM cmp eax, 'w' jne skip. Write ; Se não, skip call write. File jmp out. Of. This. Mess skip. Write: call do. Something. Else out. Of. This. Mess: . . . ; resto do programa
Simulando comandos C - If-then-else C if (EAX == 'w') { write. File(); } else { do. Something. Else(); } AT&T cmpl 'w‘, %eax jne skip. Write ; Se não, skip call write. File jmp out. Of. This. Mess skip. Write: call do. Something. Else out. Of. This. Mess: . . . ; resto do programa
Simulando comandos C - while C int i = 0; while(i< 100){ i = i + 1; } NASM mov eax, 0 while. Loop: mov ebx, 100 cmp eax, ebx jge While. Terminado inc eax jmp While. Loop While. Terminado: ; resto do código
Simulando comandos C - while C int i = 0; while(i< 100){ i = i + 1; } AT&T movl $0, %eax while. Loop: movl $100, %ebx cmpl %ebx, %eax jge While. Terminado incl %eax jmp While. Loop While. Terminado: ; resto do código
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 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 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 Rotinas assembly escritas como funções inline Características – Convenientes – Velozes – Amplamente utilizadas na programações de sistemas
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 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 Inline No caso de mais de uma instrução: – Escreve-se uma por linha – Entre aspas – Com o sufixo “nt” ao final da instrução – Isso se deve ao fato de que GCC envia cada instrução como uma String ao GNU Assembler
Assembly Inline Exemplo 3: #include <stdio. h> int main() { __asm__ ( "movl %eax, %ebxnt“ "movl $56, %esint“ "movl %ecx, $label(%edx, %ebx, $4)nt" "movb %ah, (%ebx)"); }
Assembly Inline Exemplo 4: #include <stdio. h> int main() { __asm__(" movl $1, %eax xor %ebx, %ebx "); } int $0 x 80 // SYS_exit
Criando um projeto C/C++ no eclipse
Criando um projeto C/C++ no eclipse
Exemplo Código C/C++
Exemplo Código C/C++
Executando a aplicação
Hello World usando Interrupções
Hello World usando Interrupções
Chamando funções externas
Chamando funções externas (múltiplos parametros)
Chamando funções externas (múltiplos parametros)
Chamando funções externas (múltiplos parametros)
Obtendo o tempo de sistema
Criando e Modificando Arquivos
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 80 h
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
Linux Man Pages A partir do terminal do unix: – Exemplo: digite “man 2 write” Online: – http: //www. linuxmanpages. com/ – http: //man. he. net/ – http: //www. die. net/doc/linux/man/
Assembly – Referências http: //www/~htcrs/if 677/assembly/referencias. txt
- Slides: 45