330 likes | 441 Views
Hugo Calazans htcrs@cin.ufpe.br. ASSEMBLY – aula 2. Roteiro. 1- Recapitulação (Intel x AT&T) 2- Pilha e command line arguments 3- Procedimentos 4- Simulando alguns comandos C 5- Assembly inline 6- Linux Man Pages. Intel x AT&T - recapitulação. Intel x AT&T - recapitulação.
E N D
Hugo Calazans htcrs@cin.ufpe.br ASSEMBLY – aula 2
Roteiro 1- Recapitulação (Intel x AT&T) 2- Pilha e command line arguments 3- Procedimentos 4- Simulando alguns comandos C 5- Assembly inline 6- Linux Man Pages
Intel x AT&T- recapitulação • Diferenças: 1- Ordenação entre source e destination 2- Nome dos registradores (prefixação) 3- Operandos imediatos (prefixação) 4- Menção feita ao tamanho dos operandos 5- Manipulação de operandos na memória
Intel x AT&T- Exemplo: Fatorial • C int fatorial (int numero) { int fat = 1; if (numero <= 1) return 1; fat = numero * fatorial (numero - 1); return fat; }
Intel x AT&T- Exemplo: Fatorial • Intel 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
Intel x AT&T- Exemplo: Fatorial • AT&T 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
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
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 • Exemplo: • ./programa infra software 677
Pilha e Argumentos de linha de comando • Exemplo: • ./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
DOS proc fileWrite: mov ah, 40h mov bx, [filehandle] mov cl, [stuffLen] mov dx, offset stuffToWrite int 21h ret endp fileWrite Procedimentos?No DOS, sim!
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 Procedimentos?No Linux, não. Labels!
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”
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
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
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
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 • 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 “\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 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 Inline • Exemplo 4: #include <stdio.h> int main() { __asm__(" movl $1,%eax // SYS_exit xor %ebx,%ebx int $0x80 "); }
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 80h
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 www.cin.ufpe.br/~htcrs/if677/
Exercício • Escreva programas em C que implementem: • Loops • Impressão de String na tela • Gere o código assembly correspondente a esses programas • Analise o código gerado