Немаскируемое прерывание вырабатывается на системной плате контроллером системной шины в случае возникновения ошибки четности при обращении к памяти или к устройству на шине. При этом сигнал запроса подается на соответствующий вход микропроцессора (NMI).
Прерывания int 6 и int 7 не используются в МП 8086/88. Прерывание int 7 генерируется при обращении к сопроцессору, присутствие которого предусмотрено не во всех конфигурациях ВС. Невозможность идентифицировать команду процессора приводит к возникновению прерывания int 6.
Если действия программы обработки прерывания не устраивают, то ее можно заменить собственной, перенастроив вектор прерывания. Для этого необходимо выполнить следующие действия:
· получить текущее значение вектора прерывания,
· сохранить старое значение вектора в заранее зарезервированных ячейках сегмента данных,
· установить новое значение вектора,
· написать основную программу, инициирующую замененное прерывание
· восстановить старое значение вектора для дальнейшей бесконфликтной работы. В противном случае последующая программа может вызвать данное прерывание и передать управление на то место в памяти, где вашей программы уже нет,
· написать собственную программу обработки прерывания,
· в случае необходимости передать управление стандартному обработчику. Это целесообразно сделать, если собственный обработчик функционально дополняет имеющийся в системе.
З а м е ч а н и е:
Выполнить чтение или запись вектора прерывания можно двумя способами: либо по номеру прерывания вычислить адрес ячейки памяти в области IDT и выполнить прямое обращение для чтение или записи (см. пример установки вектора прерывания в п. 2.2), либо воспользоваться функциями DOS прерывания int 021h. Для чтения вектора из IDT применяется функция 035h, а для записи используется функция 025h прерывания int 021h. Параметры функций 35h и 25h приведены в табл. П.2. приложения. Функция 25h автоматически запрещает аппаратные прерывания в процессе изменения вектора.
В [13] приведен ряд примеров чтения/записи векторов прерывания. Ниже приведен эквивалент функции 035h прерывания int 021h операционной системы DOS (чтение вектора прерывания, номер которого должен быть предварительно помещен в регистр al):
mov di, al ; номер прерывания — в DI
xor ax, ax ; устанавливаем ES в начало ОЗУ
mov es, ax
shl di, 2 ; умножаем номер прерывания на 4
mov bx, es:[di] ; помещаем в BX смещение
; обработчика прерывания
mov ax, es:[di]+2 ; помещаем в ES сегментный адрес
; обработчика прерывания
mov es, ax
В результате полный адрес обработчика прерывания с номером из регистра al окажется в регистрах es:bx, как это делает функция 035h DOS.
Аналогичным образом осуществляется установка нового вектора прерывания. Эквивалентная функции 025h прерывания int 021h DOS.
1. Как вычислить адрес вектора прерывания, если известен номер данного прерывания?
2. Объясните назначение бита Т в регистре флагов процессора.
3. Можно ли замаскировать внутренние прерывания?
4. Каковы действия процессора при входе и возврате из прерывания? Сбрасываются ли флаги T и I при переходе к программе обработки внутреннего прерывания?
5. Что означает "перехватить прерывание"?
6. Зачем и как осуществляется передача управления системному обработчику?
Целями работы являются знание логики взаимодействия процессора и контроллера прерываний, способов маскирования аппаратных прерываний, системы приоритетов, приобретение навыков использования стандартных средств для обслуживания аппаратных прерываний, умение создавать собственные и дополнять уже существующие программы обработки прерываний.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.