320 likes | 462 Views
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:
E N D
Armando Gonçalves CiroCeissler 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: 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 • 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 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: 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
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
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 "); }