Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование прерываний.doc
Скачиваний:
2
Добавлен:
16.11.2019
Размер:
125.95 Кб
Скачать

Регістр ознак стану процесора (регістр флагів)

15 8 7 0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

Пример программы.

Например, установим режим SVGA (стандарт VESA):

#include <dos.h>

………

// функция пользователя для установки

// видеорежима получает из главной

// программы номер режима iVMode,

// например, 118h:

Int SetSvgaMode (int iVMode)

{

union REGS inregs, outregs;

inregs.h.ah = 0x4f; // функция 4Fh

// для работы с режимами VESA

// заносится в AH;

inregs.h.al = 0x02; // функция 2h

// для установки режима – в AL;

inregs.x.bx = iVMode; // в ВХ

// заносится номер режима VESA,

// например, 118h,

// и вызывается прерывание INT10h:

Int86 (0x10, &inregs, &outregs);

if ((outregs.h.al == 0x4f) &&

(outregs.h.ah == 0))

// (успешное выполнение)

return 0;

else // (ошибка установки режима)

return –1;

}

При программировании на Ассемблере прерывание INT 10h вызывается следующим образом:

mov ah, 4Fh ; функция для работы с

; адаптером,

mov al, 2h ; подфункция установки

; режима,

mov bx, 118h ; номер режима,

Int 10h ; прерывание для работы с ; видеосистемой.

Можно и так:

mov aх, 4F02h

mov bx, 118h

int 10h

Изменение таблицы векторов прерываний

Программе может потребоваться организовать обработку некоторых нестандартных прерываний. Для этого программа должна переназначить вектор на свой обработчик. Это можно сделать, изменив содержимое соответствующего элемента таблицы векторов прерываний (60h-67h).

Очень важно не забыть перед завершением работы восстановить содержимое измененных векторов в таблице прерываний, т.к. после завершения работы программы память, которая была ей распределена, считается свободной и может быть использована для загрузки другой программы. Если вы забыли восстановить вектор и пришло прерывание, то система может разрушиться – вектор теперь указывает на область, которая может содержать что угодно.

Последовательность действий для нерезидентных программ, изменяющих прерывания:

  • прочитать содержимое элемента таблицы векторов прерываний для вектора с нужным вам номером;

  • запомнить это содержимое (адрес старого обработчика прерывания) в области данных программы;

  • установить новый адрес в таблице векторов прерываний так, чтобы он соответствовал началу новой программы обработки прерывания;

  • перед завершением работы программы прочитать из области данных адрес старого обработчика прерывания и записать его в таблицу векторов прерываний.

Для облегчения работы по замене прерывания DOS имеет специальные функции для чтения элемента таблицы векторов прерывания и для записи в нее нового адреса. При использовании этих функций DOS гарантирует, что операция по замене вектора будет выполнена правильно.

Для чтения вектора используйте функцию 35h прерывания 21h. Перед ее вызовом регистр AL должен содержать номер вектора в таблице. После выполнения функции в регистрах ES:BX будет искомый адрес обработчика прерывания.

Функция 25h прерывания 21h устанавливает для вектора с номером, находящимся в AL, обработчик прерывания DS:DX.

Для пользователей языка Си библиотека Quick C содержит функции _dos_getvect( ), _dos_setvect( ). Первая функция получает адрес из таблицы векторов прерываний, вторая устанавливает новый адрес.

Если вам надо добавить какие-либо собственные действия к тем, что выполняет стандартный обработчик прерывания, то можно организовать цепочку прерываний.

Для организации цепочки прерываний вы записываете в векторную таблицу адрес своего обработчика, не забыв сохранить прежнее содержимое таблицы. Ваш обработчик получает управление по прерыванию, выполняет какие-либо действия, затем передает управление стандартному обработчику. Можно сделать и по-другому - ваш обработчик вызывает стандартный обработчик как подпрограмму, после возврата из стандартного обработчика выполняет дополнительные действия. Можно вставить дополнительную обработку как до вызова стандартного обработчика, так и после его вызова.

В библиотеке Quick C имеется функция для организации цепочки прерываний – _chain_intr( ).

Рассмотрим более подробно возможности библиотеки интегрированной среды Quick C, предназначенные для работы с прерываниями.

Модификатор interrupt (_interrupt для Quick C 2.5 и C 6.0) описывает функцию, которая является обработчиком прерывания. Такая функция завершается командой возврата из обработки прерывания IRET, и для нее автоматически генерируются команды сохранения регистров на входе и их восстановления при выходе из обработчика прерывания. Пример использования модификатора для описания функции обработки прерывания: