|
|
|
|
Подмена прерывания
Процесс изменения строки IVT (таблицы векторов прерываний) известен как подмена прерывания. Резидентные программы запускаются от прерываний при
нажатии горячих ключей. Те, которые выполняются периодически, зависят от прерываний от таймера. Обычно для управления обработкой запроса DOS и
состоянием аппаратных средств и для размещения самих предварительно загруженных копий TSR изменяют IVТ. Для некоторых команд DOS (функций int 21h)
прерывания от таймера дают непредсказуемый результат.
Для подмены прерывания код инициализации TSR считывает строку IVT, запоминает ее содержимое в области данных и вставляет новый адрес в таблицу IVT.
При получении следующего прерывания управление будет передаваться новой программе обработки прерываний (ISR). Новый код ISR будет обычно вызывать
сначала оригинальную ISR. Когда старая ISR выполнится, ее команда IRET передаст управление Вашему коду, который для передачи управления программе вводит
собственную команду IRET , которая передает управление программе, которая первоначально вызвала прерывание.
DOS обеспечивает два пути для перехвата вектора прерывания. Для нахождения содержимого специфицированной строки IVT помещает номер ее прерывания в
регистр AL, значение 35h в регистр AH и выполняет команду 21h. BIOS обеспечивает возвращение содержимого строки IVT в пару регистров ES:BX.
После записи этого значения, можно модифицировать строку IVT. В DS:DX загружается адрес новой ISR, в регистре AL задается номер вектора прерывания, в
регистр AH помещается 25h, и выполняется команда 21h. Листинг 4-4 иллюстрирует использование этого способа подмены прерывания от таймера.
Листинг 4-4. Подмена прерывания от таймера Int 1ch
----------------------------------------------------------------
OldInt1cDD 0
mov ax,351ch ; получение int 1c
int 21h
mov WORD PTR OldInt1c,bx ; сохранение его
mov WORD PTR OldInt1c+2,es; сохранение ds
push ds
mov ax,cs
mov ds,ax
mov ds,OFFSET NewInt1c ; ds:dx <== новая isr
mov ax,251ch ; установить новую isr
int 21h
pop ds ; восстановление ds
; ... ; все, что угодно
NewInt1c PROC FAR
pushf ; моделирование флагов стека
call cs:OldInt1c ; прерывание
; ... ; все, что угодно
iret
NewInt1c ENDP
----------------------------------------------------------------
|
Специальные действия, включенные в новую ISR, зависят от того, какую строку IVT вы меняете и что вы предпринимаете для выполнения этой замены.
Заметим, что новая ISR "сцеплена" со старой. Эта техника общепринята. Последовательность pushf/call подменяет команду INT. Заметим, что call должен
быть межсегментным (дальним) вызовом, потому, что OldInt1c является двойным словом.
|
|