Atividade 3 (obrigatória): Programação de rotinas de interrupção
Editado em 30 Set 2003
O objetivo desta atividade é codificar
em assembler duas rotinas de interrupção completas.
1.1 Escreva um programa inteiramente em assembler que:
- envia uma mensagem inicial qualquer para o vídeo,
- salva o vetor de interrupção de número 3 (breakpoint)
numa área de dados do seu programa,
- instala no vetor 3 uma nova rotina de interrupção para breakpoint, escrita por V.,
- executa o seguinte trecho de programa, onde V. deve codificar as partes
em texto livre :
mov cx,4
l1:
exibe no vídeo a mensagem: "dentro do laco..." (*)
salva o 1º byte da instrução em rot e coloca nele o código de breakpoint (0cch)
rot: sub cx,2
jnz l1
restaura o vetor de interrupção 3 original
exibe no vídeo a mensagem : "terminando ..." (*)
volta ao prompt do DOS
- na rotina de interrupção de breakpoint V. deve:
- exibir no vídeo a mensagem "dentro da rotina de breakpoint..."
usando a função int 21h ah=09 do DOS;
- restaurar o byte salvo onde agora está o código de breakpoint (0cch)
- alterar o endereço de retorno salvo na pilha para o endereço da
instrução interrompida pelo breakpoint (sub cx,2)
- via instrução iret voltar ao programa interrompido
(o que fará com que a instrução sub cx, 2 seja executada )
1.2 Escreva um programa inteiramente em assembler que:
- envia uma mensagem inicial qualquer para o vídeo,
- salva o vetor de interrupção de número 0 (divisão por zero)
numa área de dados do seu programa,
-
instala uma nova rotina de interrupção para interceptar divisão
por zero, (escrita por V.)
-
executa uma instrução de divisão por zero
(o que vai gerar uma interrupção de número 0),
-
ao interceptar a divisão por zero, a sua rotina
de interrupção deve emitir uma mensagem do tipo "V. tentou
dividir por zero!" (use a função INT 21h, 09 do DOS para este fim);
- após retorno (1) da sua rotina de interrupção o seu programa deve restaurar
o vetor de interrupção original,e,
- executar novamente uma instrução que divide por zero (neste caso a mensagem
original do DOS será enviada ao vídeo e seu programa será interrompido).
Obs:
(1) a fim de evitar que seu programa entre num laço
infinito de interrupções, a rotina de interrupção
deve retornar com o IP apontando para a instrução seguinte
àquela que fez a divisão por zero.
(2)Tanto no caso 1.1 como 1.2, a única função do DOS permitida no seu programa é a de
saída de cadeia decaracteres no vídeo INT 21h, 09.
1.3 (Opcional) Modifique o programa myint.asm visto em aula de forma a instalar
a rotina de interrupção myint no vetor 1ch que é acionado pelo BIOS
cerca de 18 vezes por segundo.
Utilize um contador na memória com valor inicial igual a 18, decrementando-o
dentro da rotina a cada interrupção: somente quando o contador chegar a 0 emita a
mensagem "dentro da rotina de interrupção"
e volte o contador ao valor inicial. Como o BIOS muda o valor de ds ao acionar
a interrupção 1ch, na rotina myint V. deve fazer ds := cs. No laço principal
do programa V. deve ficar à espera da interrupção executando a instrução hlt
como no exemplo a seguir:
l0:
hlt ; esta instrução é simulada pela máquina virtual do Windows
jmp l0
; interrompa a execução com Ctrl-C !!
Observe que o truque de mostrar o número do vetor não vai funcionar nesse
caso. Ignore o problema.
V. deve demonstrar o funcionamento dos dois programas no laboratório
e entregar impressões dos programas em assembler (no formato .lst)
Data de submissão: 30/09/03. Prazo de Entrega: 9/10/03.