Изучение принципов обработки аппаратных прерываний. Логика взаимодействия процессора и контроллера прерываний, страница 2

Регистр 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