При инициализации прикладного обработчика, сцепляемого
При инициализации прикладного обработчика, сцепляемого с системным, следует точно так же, как и раньше, сохранить в программе адрес системного обработчика и поместить в вектор прерывания адрес прикладного обработчика. Изменениям подвергнется только программа самого обработчика, начало которой должно выглядеть следующим образом:
;Сцепление прикладного обработчика с системным
; для программы 3-3
new_08 proc
pushf ;Отправляем в стек слово флыгов
call CS:old 08 ; В системный обработчик
... ;Продолжение программы обработчика
iret
new_08 endp
Как будет работать такая программа? После того, как процессор выполнит процедуру прерывания, в стеке прерванного процесса оказываются три слова: слово флагов, а также двухсловный адрес возврата в прерванную программу (рис.3.5, нижние три слова стека).
Рис. 3.5. Стек прерванной программы в процессе выполнения прикладного обработчика прерываний.
CS1 - сегментный адрес прерванного процесса;
IP1 - смещение точки возврата в прерванную программу;
CS2 - сегментный адрес прикладного обработчика;
IP2 - смещение точки возврата в прикладной обработчик.
Именно такая структура данных должна быть на верху стека, чтобы команда iret, которой завершается любой обработчик прерываний, могла вернуть управление в прерванную программу.
Первая команда нашего обработчика pushf засылает в стек еще раз слово флагов, а команда дальнего вызова процедуры call cs:old_08 (где ячейка old_08 объявлена с помощью оператора dd двойным словом) в процессе передачи упражнения системному обработчику помещает в стек двухсловный адрес возврата на следующую команду прикладного обработчика. В результате в стеке формируется трехсловная структура, которая нужна команде iret.
Системный обработчик, закончив обработку данного прерывания, завершается командой iret. Эта команда забирает из стека три верхние слова и осуществляет переход по адресу CS2:IP2, т.е. на продолжение прикладного обработчика.
Содержание Назад Вперед