Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

1.7. Вызов прерываний MS-DOS

Программы, составленные на языке С, обращаются к прерываниям MS-DOS обычно с помощью таких функций, как intdos, int86, intdosx и т. д.

Для передачи параметров используются структуры REGS, WORDREGS, BYTEREGS, SREGS, описанных в файле dos.h. Программа записывает параметры в поля структуры, соответствующие регистрам процессора, а затем вызывает одну из перечисленных выше функций, передавая ей адрес структуры. После выполнения прерывания результат записывается в эту же или другую структуру. Например:

union REGS inregs, outregs;
struct SREGS segregs;
....
  inregs.h.ah = 0x3a;
  segregs.ds = FP_SEG(dir_name);
  inregs.x.dx = FP_OFF(dir_name);
  intdosx(&inregs, &outregs, &segregs);
....

В этом фрагменте кода вызывается функция 3Ah прерывания INT 21h, для чего используется функция intdosx, которая входит в стандартную библиотеку системы разработки Borland C++.

Номер функции записывается в поле h.ah объединения inregs, параметры функции (передаваемые через регистры DS:DX), соответственно, в поле ds структуры segregs и в поле x.dx объединения inregs.

Функция intdosx записывает содержимое регистров процессора после выполнения программного прерывания в объединение outregs.

Объединение REGS определено в файле dos.h следующим образом:

union  REGS{
  struct  WORDREGS x;
  struct  BYTEREGS h;
};

В нем имеется две структуры - WORDREGS и BYTEREGS.

Первая из этих структур предназначена для работы с 16-разрядными регистрами. Она определена так:

struct WORDREGS{
  unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};

В этой структуре поля ax, bx, cx, dx, si и di соответствуют одноименным регистрам процессора.

Значение флага переноса записывается в переменную cflag, определенную в структуре WORDREGS. Поле flags предназначено для остальных флагов процессора.

С помощью структуры BYTEREGS вы можете задавать (и определять) содержимое 8-разрядных регистров процессора:

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

И, наконец, для работы с сегментными регистрами предназначена структура SREGS, определенная следующим образом:

struct SREGS{
  unsigned int es;
  unsigned int cs;
  unsigned int ss;
  unsigned int ds;
};

Для использования перечисленных выше структур программа должна содержать следующую строку:

include <dos.h>

После вызова программного прерывания программа должна проверить флаг переноса, который сохраняется в поле cflag. Проверка поля cflag может быть выполнена, например, таким образом:

union REGS inregs, outregs;
....
  intdos(&inregs, &outregs);
  if(outregs.x.cflaf != 0) error();
....

Код ошибки при этом записывается в переменную outregs.x.ax.

[Назад] [Содеожание] [Дальше]