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


Пример 8



Пример 8

/*= ПРИМЕР 3.2 =*/ /*=============== Перехват прерывания ===================*/ #include <dos.h>

int intr_num = 9; /* Номер прерывания */ int intr_count = 0; /* Счетчик прерываний */ void interrupt new_handler(); /* Описание нового обработчика прерывания */ void interrupt (* old_handler)(); /* Переменная для сохранения старого вектора */ union REGS rr; /* Регистры общего назначения */ struct SREGS sr; /* Сегментные регистры */ void *readvect(int in); void writevect(int in, void *h); main() { /* Получение старого вектора */ old_handler=readvect(intr_num); /* Запись нового вектора */ writevect(intr_num,new_handler); /* Ожидание 10-кратного срабатывания */ while (intr_count

Введенные здесь дополнительные переменные rr и sr служат для передачи параметров функциям DOS. Чтение старого вектора производится при помощи функции 0x35 (ее номер перед обращением к DOS заносится в регистр AH). По спецификациям функции 0x35 в регистр AL должен быть занесен номер прерывания, вектор которого читается. Функция возвращает в регистре ES сегментную часть вектора, а в регистре BX - смещение, эти значения наша программа запоминает в переменных segm и offs.

Установка нового вектора производится при помощи функции 0x25. По спецификациям этой функции в регистр AL должен быть занесен номер прерывания, вектор которого мы устанавливаем, в регистре DS - сегментная часть вектора, а в регистр DX - смещение. Обратите внимание на то, что здесь при записи вектора мы не запрещаем прерывания - эти действия функция 0x25 выполняет сама. Восстановление вектора производится также при помощи функции 0x35.

В этой программе у нас нет необходимости вычислять адрес, по которому расположен вектор прерывания, поэтому макрос VECT_ ADDR здесь отсутствует. В прикладных задачах использованию функций DOS для чтения/установки векторов следует отдавать предпочтение еще и потому, что в новых версиях DOS адреса векторов, возможно, не будут так легко доступны пользователю.

В дальнейшем мы неоднократно будем использовать функции readvect и writevect, приведенные в примере 3.2.




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