Обработка прерываний на языке Си

Для выполнения системы операций (например, ввода, вывода) кроме обращения к регистрам выполняются прерывания, обеспечивающие приостановку выполнения головной программы. В языке Си для этого имеются следующие функции. Так функция

# include <dos.h>

intbdos (int dosfan, unsigned dosdx, unsigned dosal)

выполняет прерывание 21h со значением регистров

AH = dosfun, DX = dosdx, AL = dosal

Возвращаемое значение – содержимое регистра АХ.

Самым простым обработчиком прерывания является функция

# include <dos.h>

void geninterrupt (int intr _ num)

В ней номер прерывания задается переменной intr _ num. Перед ее выполнениями необходимо обращение к соответствующим регистрам через псевдопеременные. Необходимо быть внимательным, так как здесь при загрузке регистров возможно переопределение ранее установленных значений. Функция

# include <dos.h>

int int _86 (int intno, union REGS * inregs, union REGS * outregs)

загружает внутренние регистры значениями записанными и объединенными по шаблону union REGS, но начало которого указывает inregs и выполняет прерывание intno.

На выходе из прерывания значения внутренних регистров записываются в объединении по шаблону union REGS, на начало которого указывает outregs. Шаблон union описан в заголовочном файле <dos.h> и представляет объединение двух структур

struct WORDREGS

{unsigned int ax, bx, cx, dx, si, di, eflag, flags;};

struct BYTEREGS

{unsigned char al, ah, bl, bh, cl, ch, dl, dh;};

union REGS

{struct WORDREGS x;

struct BYTEREGS h;}:

Структура WORDREGS осуществляет доступ к регистрам как к двухбайтовым единицам, а структура BYTEREGS осуществляет доступ к их отдельным байтам. Переменной flags осуществляется доступ к регистру флагов.

Все функции этого прерывания возвращают значение регистра АХ на выходе из прерывания.

Функция

# include <dos.h>

int int 86 x (int intno, union REGS * inregs, union REGS * autregs, struct SREGS * segregs)

в отличии от предыдущей эта функция перед прерыванием устанавливает дополнительно сегментные регистры.

Функция

# include <dos.h>

int intdos (union REGS * inregs, union REGS* autregs)

аналогична предыдущим функциям, но реализует прерывания 21h

функция

# include <dos.h>

void intr (int intno, struct REGPACK* preg)

загружает внутренние регистры через структуру REGPACK

struct REGPACK {

unsigned r _ ax, r _ bx, r _ cx, r _ dx;

unsigned r _ bx, r _ si, r _ di, r _ ds, r _ cs, r _ flags;

}

Возвращаемого значения эта функция не имеет.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: