Страница 13 из 20 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]. |