1.2.4 Дополнение к существующему прерыванию.

   Хотя и не часто, но иногда  бывает  полезно добавить код к су-
ществующему прерыванию.  В качестве примера рассмотрим программы,
которые преобразуют одно  нажатие  клавиши в длинные определяемые
пользователем  символьные  строки (макроопределения  клавиатуры).
Эти программы используют факт, что  весь ввод с клавиатуры посту-
пает  поступает через функцию 0 прерывания 16H BIOS [3.1.3].  Все
прерывания ввода с клавиатуры  DOS  вызывают  прерывание BIOS для
получения символа из буфера клавиатуры.  Поэтому необходимо моди-
фицировать лишь прерывание 16H,  таким образом, чтобы оно служило
шлагбаумом для макроопределений, после чего любая программа будет
получать макроопределения,  независимо  от того, какое прерывание
ввода с клавиатуры она использует.
   Конечно,  модифицировать прерывания BIOS и DOS непросто,  пос-
кольку BIOS расположена в ПЗУ, а DOS поступает без листинга и они
ограничены  размерами  отведенной для них памяти.  Но  Вы  можете
написать процедуру, которая  предшествует  и/или следует за соот-
ветствующим  прерыванием,  и эта процедура может  вызываться  при
вызове прерывания DOS  или  BIOS.  Например,  в случае прерывания
16H,  Вам нужно написать процедуру и указать на нее вектором пре-
рывания для 16H.  Оригинальное  значение вектора 16H тем временем
переносится  в  какой-либо  неиспользуемый вектор,  скажем,  60H.
Новая процедура просто вызывает  прерывание  60H, чтобы использо-
вать  оригинальное прерывание 16H; поэтому когда программа  вызы-
вает прерывание 16H, управление передается Вашей процедуре, кото-
рая затем вызывает оригинальное прерывание 16H, которая по завер-
шении опять возвращает  управление  Вашей процедуре, а из нее уже
Вы  возвращаетесь  в то место программы, из  которого  был  вызов
прерывания 16H. После того  как  это  сделано,  в новой процедуре
может содержаться любой код, как до, так и после вызова  прерыва-
ния 60H. На рис. 1-3 показана диаграмма этой процедуры. Вот крат-
кая сводка необходимых действий:

   1. Создать новую процедуру, вызывающую прерывание 60H.
   2. Перенести вектор прерывания для 16H в 60H.
   3. Изменить вектор 16H, чтобы он указывал на новую процедуру.
   4. Завершить программу, оставляя ее резидентной [1.3.4].


 

Вы находитесь в разделе: 
Также вам будет интересно:

Добавить коментарий