Notas de Aula - MAC 211 - Laboratório de Programação
Aula anterior (aula 3)
Aula 4 - 4/3/2010
Mais comandos de linguagem de montagem
MUL, IMUL, DIV, IDIV
- recebem apenas um operando que pode ser um registrador ou uma posição de
memória.
- registrador: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP
- memória: [BX], [BX+SI+7], variable, etc...
- MUL e IMUL afetam os flags CF e OF
- os flags são 'setados' para 1 quando o resultado supera o tamanho do operando; o caso contrário
- DIV e IDIV não definem o que acontece com os flags
- MUL - multiplicação de inteiro sem sinal (unsigned):
- quando o operando é um byte:
- quando o operando é uma palavra (word) de 16 bits
- quando o operando tem 4 bytes (32 bits)
- (EDX:EAX) = EAX * operando
- a forma imediata não existe
- IMUL - multiplicação de inteiro com sinal (signed).
- DIV - divisão inteira sem sinal:
- AL = AX / operando (quando operando tem 8 bits)
- AH = resto (módulo).
- AX = (DX:AX) / operando (quando operando tem 16 bits)
- DX = resto
- EAX = (EDX:EAX) / operando (quando operando tem 32 bits)
- EDX = resto
- IDIV - divisão inteira com sinal:
- mesmas regras do DIV mas considerando números com sinal (completemento de 2)
- INC op ; op := op + 1; op++
- op pode ser qualquer registrador ou posição de memória
- DEC op ; op := op - 1; op--
- op pode ser qualquer registrador ou posição de memória
- NOT op
- NEG op
- troca o sinal de op (usando complemento de 2)
Truques com números binários
- uso de OR para setar um bit
- uso de AND para selecionar alguns bits especificos
- uso de XOR op, op para zerar op
- uso de OR op, op para testar se op e' nulo
Chamadas ao Sistema Operacional
- Como se faz uma chamada ano núcelo (kernel) do Linux a partir de linguagem de montagem:
-
colocar número da chamada ao sistema em eax
- colocar 3 primeiros argumentos em ebx, ecx, edx (mais esi e edi se necessário).
- INT 0x80
- quando há valor devolvido, ele é colocado em eax
Estrutura de um programa em linguagem de montagem
- Um programa em assembler é dividido em 4 seções:
- .text - onde fica o código-fonte; é uma seção só para leitura (read-only)
- .data - onde ficam os dados/variáveis
- .bss - onde ficam os dados/variáveis não inicializadas
-
Declaração de variáveis e strings é feita na seção .data
- db - define bytes
- equ - definição de constantes
-
Nosso primeiro programa completo em linguagem de montagem. (retirado do Linux Assembly
HOWTO, página 24)
-
mostrar primeiro versão com sintaxe Intel
- section .text ;section declaration
;we must export the entry point to the ELF linker or
global _start ;loader. They conventionally recognize _start as their
;entry point. Use ld -e foo to override the default.
_start:
;write our string to stdout
mov edx,len ;third argument: message length
mov ecx,msg ;second argument: pointer to message to write
mov ebx,1 ;first argument: file handle (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
;and exit
mov ebx,0 ;first syscall argument: exit code
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data ;section declaration
msg db "Hello, world!",0xa ;our dear string
len
equ $ -
msg
;length of our dear string
Produzindo um Executável
- Para produzir um executável é necessário:
- montar o programa para gerar o arquivo objeto .o:
- gerar o arquivo executável com auxílio do ligador:
- para executar, agora basta digitar ./hello
Desmontadores
- Programas chamados desmontadores (disassemblers) são capazes de pegar um executável ou objeto qualquer e gerar o código de montagem correspondente.
- O desmontador associado ao nasm é o ndisasm
- Exemplo: ndisasm hello.o