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


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


Если он взведен, т.е. "горячая клавиша" была нажата, то проверяется флажок занятости DOS, который устанавливается DOS в 1 при выполнении любой функции DOS (адрес флажка занятости мы определили при инициализации программы). Еще одно условие инициализации - нулевое значение флага disk_op, о котором мы расскажем ниже. Если выполнены все условия инициализации, то из функции 8 вызывается функция act_tsr, а флаг "горячей клавиши" сбрасывается.

Но полностью отказываясь от активизации TSR-программы в моменты выполнения любых функций DOS, мы можем отложить эту активизацию на весьма неопределенный срок. Например, при отсутствии выполняемых программ командный процессор находится в состоянии ожидания ввода с клавиатуры, при этом выполняется функция DOS 0x0A, следовательно, флажок занятости взведен. Имеется, однако, способ избежать такой блокировки активизации. Основным фактором нереентерабельности функций DOS является то, что разные функции DOS используют для своей работы один и тот же стек, поэтому вложенный вызов функции DOS портит стек вызывающей функции. Оказывается однако, что в DOS имеется два стека - один используется функциями с номерами до 0x0C включительно, а второй - функциями с большими номерами. Если DOS выполняет функцию с номером не выше 0x0C, то TSR-программа может активизироваться, но при своем выполнении она не должна обращаться к функциям с меньшими номерами (что, впрочем, не составляет больших проблем). Индикатором такого состояния DOS является прерывание 0x28, выдаваемое DOS, когда DOS находится в состоянии ожидания ввода. Следовательно, еще одно обрабатываемое нами прерывание - 0x28 (обработчик - new_28). Обработчик этого прерывания вызывает функцию act_tsr при установленном флаге "горячей клавиши" даже при установленном флажке занятости DOS.

Еще одно прерывание, которое необходимо перехватывать нашей программе - 0x13 (обработчик new_13) - прерывание BIOS, обеспечивающее дисковые операции. Дисковые операции не следует прерывать хотя бы потому, что некоторые из них требуют временной синхронизации.


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