Системное программное обеспечение персональных ЭВМ


Схема 1 - часть 2


/p>

При получении управления нашим обработчиком стек имеет вид, показанный на Рисунок 15.1 а. Мы расширяем стек, смещая 12 последних записанных в нем слов (содержимое регистров перед INT 2Fh) на 3 слова влево (Рисунок 15.1 б). Затем на места хранения регистров IP и CS мы записываем соответственно сегмент и смещение адреса прежнего обработчика (на Рисунок 15.1 в - OF и SG, в программе - a_2F.offs и a_2F.segm). Указатель стека корректируется таким образом, чтобы он указывал на новую вершину стека (Рисунок 15.1 г). Теперь при возврате из нашего обработчика из стека восстановятся все регистры от BP до AX, а в регистры CS:IP запишется адрес прежнего обработчика (SG: OFF), при этом в стеке останется адрес возврата в программу выдавшую прерывание 0x2F.

После того, как мы рассмотрели обработчик прерывания 0x2F, нам должно быть ясно, как происходит определение наличия резидентной копии в памяти. Функция check_tsr, выполняющая эту проверку, перебирает номера функций от 0xFF в сторону уменьшения до 0xC0, каждый раз обращаясь к прерыванию 0x2F для выполнения подфункции 0 текущей функции. Если прерывание возвращает в регистре AL 0, номер функции запоминается в глобальной переменной com_func для возможного занятия этой функции в дальнейшем. Если функция возвращает отличное от 0 значение, то область памяти, на которую указывает адрес в регистрах ES:BX, сравнивается с контрольной строкой "TSR-программа 15_1 загружена". Совпадение их является признаком того, что резидентная копия уже имеется в памяти. Для этого случая com_func принимает значение номера функции мультиплексного прерывания, занятого резидентной копией. При отсутствии резидентной копии номер первой свободной функции, запомненный в com_func, в дальнейшем используется для программных коммуникаций.




- Начало -  - Назад -  - Вперед -