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


15.5. Программные коммуникации - часть 2


В нашем примере обработчиком прерывания 0x2F является функция new_2F. Номер функции прерывания 0x2F, которую занимает наша TSR-программа является переменной, значение которой устанавливается в процессе инициализации. Обработчик прерывания прежде всего анализирует содержимое регистра AH, сравнивая его с номером занятой нашей программой функции. Если они совпадают, то далее выбирается номер подфункции из регистра AL, и выполняются действия, определенные для данной подфункции. Для нашего обработчика определены 4 подфункции.

  • Подфункция 0. В соответствии с требованиями к обработке прерывания 0x2F наш обработчик по этой подфункции возвращает код 0xFF в регистре AL. Кроме того, чтобы показать, что данная функция занята именно нашей программой, в регистрах ES:BX он возвращает адрес символьной строки "TSR-программа 15_1 загружена".
  • Подфункция 0x10 предназначена для активизации TSR-программы из другой программы. По этой подфункции вызывается функция act_tsr.
  • Подфункция 0x20 - внутренний вызов TSR-программы, она вызывается из обработчика прерывания 0x13 для получения содержимого флагов микропроцессора. По этой подфункции содержимое флагов копируется из параметров new_2F в глобальную переменную cflag.
  • Подфункция 0x30 - команда на самоуничтожение TSR-программы, по ней вызывается функция self_kill.

Если функция, с которой вызвано прерывание 0x2F, нами не опознана, необходимо обратиться к прежнему обработчику этого прерывания. Обратите внимание на то, как оформлено это обращение. Трудности, возникающие при выполнении такого обращения, характерны для перехвата всех программных прерываний. Заключаются они в том, что программные прерывания получают входные параметры в регистрах, в регистрах же возвращают и выходные параметры. Поэтому перед обращением к прежнему обработчику необходимо позаботиться о восстановлении всех регистров, а при возврате из нашего обработчика - обеспечить передачу содержимого регистров, сформированного прежним обработчиком. Применительно к прерыванию 0x2F трудности усугубляются тем, что выполняемым через него внутренним вызовам DOS (функция 0x11) параметры передаются не только через регистры, но и через стек, так что надо позаботиться о том, чтобы и содержимое стека при вызове старого обработчика было идентично тому, которое имелось при выдаче команды INT 2Fh.При программировании на языка Ассемблера это легко обеспечивается передачей управления на старый обработчик командой JMP, а не CALL. Здесь же нам приходится производить некоторые манипуляции со стеком, иллюстрируемые Рисунок 15.1.




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