1 / 33

ASSEMBLY – aula 2

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.

alagan
Download Presentation

ASSEMBLY – aula 2

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Hugo Calazans htcrs@cin.ufpe.br ASSEMBLY – aula 2

  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

  3. Intel x AT&T- recapitulação

  4. 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

  5. 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; }

  6. 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

  7. 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

  8. 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

  9. 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

  10. Pilha e Argumentos de linha de comando • Exemplo: • ./programa infra software 677

  11. Pilha e Argumentos de linha de comando • Exemplo: • ./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. 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!

  14. 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!

  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. 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

  17. 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

  18. 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

  19. 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

  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? • 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

  25. 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”)

  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: #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. 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

  30. 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

  31. 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/

  32. Assembly – Referências www.cin.ufpe.br/~htcrs/if677/

  33. 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

More Related