Для выполнения системы операций (например, ввода, вывода) кроме обращения к регистрам выполняются прерывания, обеспечивающие приостановку выполнения головной программы. В языке Си для этого имеются следующие функции. Так функция
# 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;
}
Возвращаемого значения эта функция не имеет.