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


15.3. Условия активизации и обработка прерываний - часть 3


Поэтому основная задача нашего обработчика new_13 - установить флаг disk_op, который блокирует активизацию TSR-программы на время выполнения дисковых операций. Для выполнения операции наш обработчик обращается к прежнему (системному) обработчику этого прерывания и обеспечивает возврат тех значений регистров AX, CX, DX и флагов, которые устанавливает системный обработчик (для формирования флагов приходится обращаться к функции new_2F).

И еще одно прерывание, которое обрабатывает наша программа - 0x2F, будет рассмотрено при обсуждении программных коммуникаций.

Эти пять векторов прерываний перехватываются TSR-программой при ее инициализации. При активизации TSR-программы она также должна перехватить вектор 0x24 - обработчика критических ошибок, в нашей программе он обеспечивает игнорирование ошибок во всех случаях.

Для получения и установки векторов прерываний служат у нас функции get_vector и set_vector, использующие функции DOS 0x35 и 0x25 соответственно. Представляет, однако, интерес организация передачи управления нашим обработчикам прерываний (функция set_vectors). Выделяется отдельный блок оперативной памяти размером 2 параграфа, в котором размещаются 5 команд "дальнего" перехода на наши функции обработки пяти перехватываемых при инициализации прерываний. В программе команда перехода описывается структурой struct far_jmp, в поле jmp которой заносится код команды JMP - 0xEA, а в поле int_h - адрес функции, на которую производится передача управления. В таблицу векторов записываются адреса сформированных команд перехода. Адреса прежних обработчиков прерываний запоминаются в массиве old_v. Для прерывания 0x2F сегментная часть и смещение адреса прежнего обработчика также запоминаются в дополнительной переменной a_2F. Почему же мы сразу не записали в таблицу векторов адреса наших обработчиков? Это сделано для предупреждения возможной аварии при выгрузке нашей программы (эта проблема была поставлена еще в главе 3). Наша программа включила свои обработчики прерываний в цепочки.


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