Регистр ISR используется для фиксации информации о том, какие аппаратные прерывания обслуживаются в данный момент. Применительно к рассматриваемому нами примеру это означает, что пока в этом регистре не снят флаг, соответствующий тому или иному прерыванию, повторный его вызов будет невозможен. Если используется частичное переопределение обработчика, то есть производится передача управления стандартному, снятие заявки осуществляет именно он. При полном переопределении это должен предусмотреть разработчик обработчика. Рассмотрим пример, отличающийся от выше приведенного именно таким образом:
Out2.8
include mac.inc
jmp start
old_v dd ? ;двойное слово для хранения значения вектора прерывания
char db '*'
start:
chv old_v, 08, i08_hnd ;замена ВП системного таймера
mov ah, 0
int 016 ;ожидание прерывания от клавиатуры
restv 08, old_v ;восстановление ВП системного таймера
mov ah, 04c
int 021 ;завершение выполнения программы
i08_hnd:
push ax, ds, es
mov ds, cs ;установка доступа к данным процедуры
mov es, 0b800 ;указатель на видеобуфер
mov al, char
es mov [0], al ;вывод в угол экрана символа “*”
mov al, 020 ;снятие заявки на обслуживание прерывания
out 020, al
pop es, ds, ax
iret
Исключена передача управления внешнему обработчику; в своем обработчике предусмотрено снятие заявки в регистре ISR контроллера прерываний.
При выполнении программы выводится “*”, программа завершается.
2.3. Изменение программы, в обработчике вместо прямого отображения в видеопамять выполнять процедуру инкрементации счетчика прерываний от таймера так, чтобы по истечении одной секунды происходил вызов пользовательского прерывания int60h. Перед возвратом из программы обработки int8hпередать управление исходному обработчику, чтобы не сбивать системные часы. Для иллюстрации результата в обработчик int60hвключить вывод на экран символа.
Out3.8
include mac.inc
jmp start
old_v dd ? ;двойное слово для хранения значения вектора прерывания 08h
old_v1 dd ? ;двойное слово для хранения значения вектора прерывания 060h
cntr db 0 ;счетчик прерываний от таймера
char db '*'
start:
chv old_v, 08, i08_hnd ;замена ВП системного таймера
chv old_v1, 060, i060_hnd ;замена пользовательского ВП
mov ah, 0
int 016 ;ожидание прерывания от клавиатуры
restv 08, old_v ;восстановление ВП системного таймера
restv 060, old_v1 ;восстановление пользовательского ВП
mov ah, 04c
int 021 ;завершение выполнения программы
i060_hnd:
push ax, ds, es
mov es, 0b800 ;указатель на видеобуфер
mov al, char
es mov [0], al ;вывод в угол экрана кода переменной char
inc char
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.