Atividade desafio (opcional)
Depuração de programas .com via rotinas de interrupção
"single step" e "breakpoint"
O objetivo desta atividade é escrever, instalar e testar rotinas
de interrupção "single step" (vetor 1) e "breakpoint" (vetor
3) para auxílo à depuração de programas
em assembler no formato .com de forma semelhante ao programa debug
do dos.
Requisitos:
-
ao entrar na rotina de interrupção "single step" V.
deve emitir para o vídeo pelo menos duas linhas contendo:
-
os registradores de propósito geral como mostrado pelo comando
t do debug,
-
o conteúdo do par CS:IP e os seis bytes apontados por IP (V. não
irá decompilá-los como faz o debug!)
-
a rotina de interrupção "single step" deve em seguida aceitar
os seguintes comandos emitidos via teclado:
-
tecla "enter" para continuar com o "single step" da próxima instrução,
-
"b endereço" para instalar um breakpoint no "endereço" dado,
-
"d endereço" para fazer um dump em hexadecimal de 128 bytes a partir
de "endereço" (semelhante ao comando d do debug),
-
"q" para sair do "single step" e continuar a execução normal
do programa.
-
a rotina de interrupção "breakpoint" deve saltar para
a rotina de "single step" para exibir os registradores da CPU e permitir
continuar o programa com "single step", se desejado. Apenas um breakpoint
precisa ser implementado.
-
V. deve escrever o seu programa de forma modular separando a parte
da aplicação do usuário da parte de sistema que inclui
a rotina para instalar os vetores de interrupção e as rotinas
de interrupção em si, colocando preferivelmente a parte de
sistema num arquivo que será incluido pela aplicação
via diretiva %include nome_arquivo.asm do nasm.
-
Uma boa apresentação e documentação
in-line do programa fonte
são partes essenciais
desta atividade.
Dicas importantes:
-
O bit T do registrador de estado (flags) deve ser ligado dentro
de uma rotina de interrupção e ativará a interrupção
1 apenas no fim da execução da instrução que
se segue à instrução IRET. Como não
há uma instrução do 8086 para ligar o bit T, V. deve
fazer o "ou" da constante 0100h com a palavra de estado (flags)
armazenada na pilha pela interrupção. Portanto, após
a instalação das duas rotinas de interrupção,
V. iniciará a depuração da sua aplicação
via "single step", colocando a instrução
"INT 1" imediatamente antes da parte a ser depurada. A partir desse
ponto as instruções subseqüentes serão executadas
com "single step" até V. digitar o caracter 'q'.
Para desligar o bit T do registrador de estado, V. deve fazer o "and"
da constante 0FEFFh com a palavra de estado armazenada na pilha,
antes de sair da rotina de interrupção.
-
Um "breakpoint" é instalado numa instrução
de um programa substituindo o 1º byte da instrução
pelo byte
0CCH e salvando o byte original para execução
posterior da instrução. A busca ("fetch") e execução
pela CPU dessa instrução (0cch) gera uma interrupção
3. Como algumas instruções no 8086 possuem apenas um byte
esta é uma forma conveniente de instalar breakpoints.
Obs: V. deve contatar o professor antes de se engajar nessa atividade
para combinar: acompanhamento, prazo e avaliação da atividade!