Notas de Aula - MAC 211 - Laboratório de Programação
Aula anterior (aula 5)
Aula 6 - 11/3/2010
Mais instruções do 80x86
-
indicadores ("Flags"): ZF, CF, OF, SF (sign, 1 = neg), PF (parity),
IF (interrupt) para indicar que estamos dentro de uma interrupção, TF (trace) usado para depuração, DF (direction)
-
CF (para números sem sinal)
- OF (para números com sinal e sem sinal)
- desvios condicionais e os flags
- JZ desvia se ZF está ligado
JNZ desvia se ZF está desligado
JO desvia se OF está ligado
JNO desvia se OF está desligado
JS desvia se SF está ligado
JNS desvia se SF está desligado
JC desvia se CF está ligado
JNC desvia se CF está desligado
JP desvia se PF está ligado
JNP desvia se PF está desligado
-
Pilha
-
PUSH, POP
-
PUSHF, POPF
-
PUSHA, POPA
- Subrotinas
- CALL: empilha o endereço da próxima instrução e desvia para o rótulo fornecido
- RET: desempilha um endereço da pilha e desvia para ele
-
Mais sobre desvio condicional
-
JA, JAE (sem sinal)
-
JG, JGE (com sinal)
-
causo do Gubi de programa em COBOL que usava JG ao inves de JA
-
funcionava com 256KB, nao funcionava com 640KB
-
mensagem: nao há memória disponível
-
LOOP (usa o CX como contador)
-
LOOP destino
-
equivalente a
Funções
- São como subrotinas (implementadas usando CALL e RET) mas são "reentrantes"
- Usamos a pilha para guardar os parâmetros passados e o valor devolvido pela função.
-
Antes de estragar o valor dos registradores, guardá-los na pilha (ou seja,
guarda-se na pilha o contexto do chamador)
- parâmetros a serem passados
são armazenados na pilha
- variáveis locais são armazenadas na pilha
- valor devolvido na pilha ou em EAX (depende da convenção usada)
- ESP - stack pointer (usa automaticamente o segmento da pilha SS)
- EBP - base da pilha (idem)
-
Veremos abaixo o código de um programa que usa funções.
- responsabilidade do chamador:
- empilhar argumentos
- chamar função
- liberar espaço dos argumentos
- Responsabilidade da função chamada:
- salvar BP do chamador
- salvar todos os registradores que vão ser afetados
- alocar espaço para variáveis locais
- realizar trabalho usando argumentos e variáveis locais
- setar valor de retorno (em espaço próprio ou em EAX)
- desalocar espaço para variáveis locais
- restaurar registradores afetados
- restaurar BP
- retornar
PILHA genérica valor de retorno em ax ou eax:
- variáveis locais
- registradores salvos
- ebp
- endereço de retorno
- argumentos (empilhados na ordem inversa em C, na ordem normal em PASCAL)
PILHA genérica valor de retorno na pilha:
- variáveis locais
- registradores salvos
- ebp
- endereço de retorno
- valor retornado
- argumentos (empilhados na ordem inversa em C, na ordem normal em PASCAL)
PILHA no programa FUNC.S
temp3 |
temp3 |
temp2 |
temp2 |
temp1 |
temp1 |
edx |
edx |
edx |
edx |
ebp <- ebp |
ebp |
ebp |
ebp 4 |
RET |
RET |
RET |
RET 4 |
A |
A 2 |
B |
B 2 |
C |
C 2 |
Para casa
-
Para casa: comecar a dar uma olhada no info do GNU as (tambem
conhecido como gas)
-
Para casa: escrever um programa em C bem simples, compilar com gcc
-S prog.c e ver saida prog.s
-
Para casa: rastrear a execuçao do programa com o Data Display Debugger
do Linux:
-
ddd prog
-
Problema no gdb (e ddd): nao consegui colocar breakpoint na primeira instrucao,
so' a partir da segunda :-(
-
Para casa: se quiser, experimentar depurar o mesmo programa usando o gdb.
No gdb, use o comando l para listar o codigo, o comando break
N para colocar um breakpoint na linha N, o comando run para
executar o programa e o comando s para executar passo a passo,
o comando info registers para ver os registradores, etc.