На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Подмена прерывания Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Подмена прерывания

Процесс изменения строки 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 является двойным словом.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz