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. |