Atividade 5 Rotinas de Interrupção e entrada/saída
com "embedded assembly"
O objetivo desta atividade é utilizar a técnica de "embedded
assembly" para escrever rotinas de interrupção
e controlar dispositivos de entrada/saida de um PC.
1. Re-escreva o programa inhand.c visto em
aula para:
-
salvar o atual vetor de interrupção, instalar uma nova rotina
de interrupção e no final restaurar o vetor de interrupção
original,
-
todo o corpo da rotina de interrupção deve ser escrito em
"embedded assembly",
-
ela deve emitir de dois a quatro tons com duração de
alguns segundos cada um;
-
opcionalmente emita mensagens para o vídeo dizendo a frequencia
do tom sendo emitido.
2. Escreva um programa que:
-
instala uma rotina de interrupção para interceptar uma divisão
por zero (cujo número de interrupção é 0).
-
ao interceptar a divisão por zero feita pela aplicação,
a rotina deve emitir uma mensagem do tipo "V. tentou dividir por zero,
seu programa está sendo abortado..." e terminar o programa (utilize
para este fim a função 09 int 21h do DOS)
-
teste o seu programa colocando em main() um comando em C do
tipo n= n/(n-n);
Observações:
-
Para compilar um programa em C contendo instruções em assembler
use o comando: tcc -B nomeprog.c
-
Para salvar o vetor de interrupção n utilize a função:
oldint=
getvect(n)onde
oldint deve ser uma variável do tipo
"apontador para rotina de
interrupção", isto é: void interrupt ( *oldint)()
-
para instalar um novo vetor de interrupção utilize a função
setvect
(n, faddr), vista em aula
-
a função em C outportb(num_porta, valor_8bits)
corresponde à instrução em assembler: out
num_porta, al
-
a função em C inportb(num_porta) corresponde
à instrução em assembler: in al, num_porta
-
dado um valor codfreq com o código da freqüência
de um tom, codfreq/2 duplica a freqüência e codfreq*2 divide
a freqüência por 2.
-
Para ajustar a duração do tom do alto-falante (em segundos)
e de forma independente da velocidade da CPU V. pode opcionalmente usar
a rotina delay incluída no exemplo
delay.asm
visto em aula. V. precisa mudá-la, no entanto, porque o "inline
assembly" será montado pelo tasm da Borland (e não
pelo nasm) e o tasm não aceita o uso dos registradores
de 32 bits do 386+ (eax e ebx), mas V. pode trabalhar apenas com
os 16 bits menos significativos do contador do Relógio de Tempo
Real. Outra diferença é que o acesso a uma posição
de memória pelo seu endereço numérico tem uma sintaxe
diferente no tasm: para ler os 16 bits menos significativos do contador
V. deve usar no seu "inline assembly" a instrução: asm
mov reg16, ds:word ptr 046ch .
-
V. deve demonstrar o funcionamento dos dois programas no laboratório
e entregar uma listagem dos mesmos.
Data de submissão: 30/Out. Prazo de entrega: 20/Nov.
Esta atividade terá pêso 2.