Справочник программиста на персональном компьютере фирмы IBM. Системные ресурсы
Страница 13. Дополнение к существующему прерыванию


 

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].

 
« Предыдущая статья   Следующая статья »