Notas de Aula - MAC 211 - Laboratório de Programação
Aula 6 - 20/3/2001
-
Mais instruçoes do 80x86
-
indicadores ("Flags"): ZF, CF, OF, SF (sign, 1 = neg), PF (parity),
IF (interrupt), TF (trace), DF (direction)
-
CF (para numeros sem sinal) OF (para numeros com sinal e sem sinal)
-
Pilha
-
PUSH, POP
-
PUSHF, POPF
-
PUSHA, POPA
-
CALL, RET (subrotinas, o endereço de retorno e' empilhado)
-
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 ha' memoria disponivel
-
LOOP (usa o CX como contador)
-
LOOP destino
-
equivalente a
-
Segmentos (como paginas de livros)
-
Registradores de segmentos
-
cs - código (.text)
-
ds, es - dados (.data)
-
ss - pilha (.stack)
-
MOVSB, MOVSW (tamanho byte ou word (=2 bytes))
-
copia um byte (ou word) de ds:(%si) para es:(%di)
-
REP MOVSB implementa o seguite:
-
aqui: mov ds:(%si), es:(%di)
inc/dec %si
inc/dec
%di
dec %cx
jnz aqui
-
a direcao e' determinada pelo flag DF
-
o REP usa o CX como contador de bytes ou words
-
Para casa: montar o leEscreve.S
da aula passada usando a opcao -a para ver os bytes gerados pelo as. Esse e' o
verdadeiro codigo em linguagem de maquina.
-
as -a -o leEscreve.o leEscreve.s
-
Para casa: montar um programa gerando simbolos para o depurador com
-
as --gstabs -o prog.o prog.s
-
ld -o prog prog.o
-
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.
Página de MAC211
Página do Fabio
Página do DCC