"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу авторапару слов в младших ячейках памяти. Смещение вектора может быть
вычислено простым умножением номера вектора на 4. Например, чтобы получить адрес прерывания 16H в ES:BX: ;---получение адреса прерывания 16H SUB AX,AX ;устанавливаем ES на начало памяти MOV ES,AX MOV DI,16H ;номер прерывания в DI SHL DI,1 ;умножаем на 2 SHL DI,1 ;умножаем на 2 MOV BX,ES:[DI] ;берем младший байт в BX MOV AX,ES:[DI]+2 ;берем старший байт в ES MOV ES,AX Не рекомендуется прямо устанавливать вектор прерываний, обходя функцию DOS. В частности в многозадачной среде операционная сис- тема может поддерживать несколько таблиц векторов прерываний и реальный физический адрес таблицы может быть известен только DOS. .h3 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, которая по завер- шении опять возвращает управление Вашей процедуре, а из нее уже Вы возвращаетесь в то место программы, из которого был вызов |
|
|