Пример 1. Привести пример блокировки дискового прерывания.
Решение. Для блокировки дискового прерывания необходимо маскировать 6-й разряд регистра маски IMR контроллера прерываний, соответствующий линии IRQ6. После выполнения операций, требующих маскирования дискового прерывания, следует обязательно очистить регистр IMR, иначе обращения к дискам будет невозможно.
MOV AL, 01000000b; маскируем 6-й бит регистра маски
OUT 21h, AL ; передаем код в регистр маски прерываний
... ; выполнение операций, требующих маскирования прерывания
MOV AL, 0 ; код очистки регистра маски прерываний
OUT 21h, AL ; передаем код в регистр маски прерываний
Пример 2. Привести пример замены векторы прерывания с помощью функций MS-DOS.
Решение. В практике разработки системных программ часто возникают необходимость дополнения существующего или создания собственного обработчика прерывания. Перед установкой нового вектора прерывания следует получить текущее значение вектора, сохранить его, а затем восстановить перед завершением программы.
Функция 35h прерывания 21h возвращает текущее значение вектора прерывания, помещая адрес сегмента в ES, а смещения в BX. Функция 25h прерывания 21h позволяет установить вектор прерывания на определенный адрес, указанный регистровой парой DS:DX. Заметим также, что обе функции автоматически запрещают аппаратные прерывания на время изменения вектора, поэтому не существует опасности, что может произойти аппаратное прерывание, использующее данный вектор.
В приведенном примере изменяется вектор прерывания клавиатуры 09h. Код завершения подпрограммы обработки прерывания перед инструкцией IRET необходим только для аппаратного прерывания. Для обработчиков, являющихся расширениями существующих прерываний, код завершения не нужен.
; сегмент данных
OldInterruptSegment DW ? ; адрес сегмента заменяемого вектора прерывания
OldInterruptOffset DW ? ; адрес смещения заменяемого вектора прерывания
; в начале программы
MOV AH,35h ; номер функции для получения вектора
MOV AL,09h ; номер запрашиваемого вектора прерывания
INT 21h ; выполнение функции получения адреса вектора
MOV OldInterruptOffset,BX ; сохранение адреса смещения вектора
MOV OldInterruptSegment,ES ; сохранение адреса сегмента вектора
; установка нового прерывания
PUSH DS ; сохранение в стеке содержимого DS
MOV DX,OFFSET Routine ; помещение в DX смещения процедуры обработки
MOV AX,SEG Routine ; помещение в AX сегмента процедуры обработки
MOV DS,AX ; передаем в DS адрес сегмента
MOV AH,25h ; номер функции для установки вектора
MOV AL,09h ; номер изменяемого вектора
INT 21h ; изменение вектора прерывания
POP DS ; восстановление из стека прежнего содержимого DS
; новый обработчик прерывания 9h
Routine PROC FAR ; объявление подпрограммы обработчика как дальней
PUSHA ; сохранение регистров в стеке
... ; выполнение кода подпрограммы обработки прерывания
POPA ; восстановление регистров
MOV AL,20h ; завершение обработки аппаратного прерывания
OUT 20h,AL ; передаем код в регистр обслуживания прерывания
IRET ; возврат из процедуры обработки прерывания
Routine ENDP ; завершение подпрограммы
; восстановление прежнего прерывания
PUSH DS ; сохранение в стеке регистра DS
MOV DX,OldInterruptOffset ; помещение в DX смещение прежнего вектора
MOV AX,OldInterruptSegment ; помещение в AX сегмента прежнего вектора
MOV DS,AX ; передаем адрес сегмента в регистр DS
MOV AH,25h ; номер функции для установки вектора
MOV AL,09h ; номер изменяемого вектора
INT 21h ; восстановление прежнего вектора
POP DS ; восстановление из стека регистра DS
Do'stlaringiz bilan baham: |