Title: ASSEMBLY
1ASSEMBLY aula 2
- Hugo Calazans
- htcrs_at_cin.ufpe.br
2Roteiro
- 1- Recapitulação (Intel x ATT)
- 2- Pilha e command line arguments
- 3- Procedimentos
- 4- Simulando alguns comandos C
- 5- Assembly inline
- 6- Linux Man Pages
3Intel x ATT- recapitulação
Intel Code ATT Code
mov eax,1 mov ebx,0ffh int 80h mov ebx, eax mov eax,ecx mov eax,ebxplus3 mov eax,ebx20h add eax,ebxecx2h lea eax,ebxecx sub eax,ebxecx4h-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
4Intel x ATT- 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
5Intel x ATT- Exemplo Fatorial
- C
- int fatorial (int numero)
- int fat 1
- if (numero lt 1)
- return 1
- fat numero fatorial (numero - 1)
- return fat
6Intel x ATT- 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 0eax (je pula se
igual) - imul ebx, eax // ebx ebxeax
- dec eax //decrementa eax
- jmp L1 // pulo incondicional para L1
- L2 ret
7Intel x ATT- Exemplo Fatorial
- ATT
- movl 5, eax
- movl 1, ebx
- L1 cmpl 0, eax //compara 0 com o valor em eax
- je L2 //pula p/ L2 se 0eax (je pula se
igual) - imull eax, ebx // ebx ebxeax
- decl eax //decrementa eax
- jmp L1 // pulo incondicional para L1
- L2 ret
8Intel x ATT- 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
9Intel x ATT- Exemplo Ponto de entrada
- ATT
- .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
10Pilha e Argumentos de linha de comando
- Exemplo
- ./programa infra software 677
PILHA
4
programa
infra
software
677
11Pilha e Argumentos de linha de comando
- Exemplo
- ./programa infra software 677
INTEL ATT O que é?
pop eax pop ebx pop ecx pop edx pop eax pop eax pop ebx pop ecx pop edx pop eax de args programa infra software 677
12Procedimentos?
- 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
13Procedimentos?No DOS, sim!
- DOS
- proc fileWrite mov ah, 40h mov bx,
filehandle mov cl, stuffLen mov dx,
offset stuffToWrite int 21h ret - endp fileWrite
14Procedimentos?No Linux, não. Labels!
- INTEL
- fileWrite mov eax,4 mov ebx, filedesc mov
ecx, stuffToWrite mov edx, stuffLen int
80h ret endp fileWrite
- ATT
- fileWrite movl 4, eax movl (filedesc),
ebx movl stuffToWrite, ecx movl (stuffLen),
edx int 0x80 ret endp fileWrite
15Gerando 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
16Simulando comandos C- If-then-else
- 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
17Simulando comandos C- If-then-else
- C
- if (EAX 'w') writeFile()
- else doSomethingElse()
- ATT
- cmpl 'w, eax
- jne skipWrite Se não, skip
- call writeFile
- jmp outOfThisMess
- skipWrite
- call doSomethingElse
- outOfThisMess ... resto do programa
18Simulando comandos C- while
- C
- int i 0
- while(ilt 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
19Simulando comandos C- while
- C
- int i 0
- while(ilt 100)
- i i 1
- ATT
- movl 0, eax
- whileLoop movl 100, ebx
- cmpl ebx, eax
- jge WhileTerminado
- incl eax
- jmp WhileLoop
- WhileTerminado
- resto do código
20Assembly 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
21Assembly 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
22Assembly 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
23Assembly Inline
- Rotinas assembly escritas como funções inline
- Características
- Convenientes
- Velozes
- Amplamente utilizadas na programações de sistemas
24Assembly 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
25Assembly 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)
26Assembly 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
27Assembly Inline
- Exemplo 3
- include ltstdio.hgt
- int main()
-
- __asm__ ( "movl eax, ebx\n\t
- "movl 56, esi\n\t
- "movl ecx, label(edx,ebx,4)\n\t"
"movb ah, (ebx)") -
28Assembly Inline
- Exemplo 4
- include ltstdio.hgt int main()
- __asm__("
- movl 1,eax // SYS_exit xor ebx,ebx
- int 0x80 ")
-
29Linux Man Pages
- O que são?
- documentação extensiva presente na maior parte
dos SOs da família UNIX - Comando
- man ltpage_namegt
- Ótima referência para system calls
- Section 2
- Executadas a partir do serviço de interr 80h
30Linux 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
31Linux 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/
32Assembly Referências
- www.cin.ufpe.br/htcrs/if677/
33Exercí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