MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 1.8. Программа ERRCODEПриведем пример программы с именем ERRCODE (листинг 1.1), которая стирает каталог с именем DIR в текущем каталоге и, в случае ошибки, выводит расширенную информацию об ошибке, класс ошибки, код предполагаемых действий и код локализации ошибки. Листинг 1.1. Файл errcode\errcode.cpp #include <dos.h> #include <stdio.h> #include <conio.h> union REGS inregs, outregs; struct SREGS segregs; void main(void); void main(void) { char far *dir_name = "DIR"; // Стираем каталог с именем DIR. Для этого вызываем // функцию 0x3A прерывания INT 21h inregs.h.ah = 0x3a; segregs.ds = FP_SEG(dir_name); inregs.x.dx = FP_OFF(dir_name); intdosx(&inregs, &outregs, &segregs); // Если после выполнения прерывания установлен // флаг переноса, выводим сообщение об ошибке if(outregs.x.cflag != 0) { printf("\n\nОшибка при удалении каталога:\t%d", outregs.x.ax); // Получаем расширенную информацию об ошибке // с помощью функции 0x59 прерывания INT 21h inregs.h.ah = 0x59; inregs.x.bx = 0; // Сохраняем регистры в стеке, так как их содержимое // изменится asm push ds asm push es asm push si asm push di // Вызываем прерывание intdosx(&inregs, &outregs, &segregs); // Восстанавливаем содержимое регистров asm pop di asm pop si asm pop es asm pop ds // Выводим расширенную информацию об ошибке printf("\nРасширенный код ошибки: \t%d" "\nКласс ошибки: \t%d" "\nПредполагаемые действия:\t%d" "\nЛокализация ошибки: \t%d", outregs.x.ax, outregs.h.bh, outregs.h.bl, outregs.h.ch); } printf("\n\nНажмите любую клавишу..."); getch(); } При составлении программ обработки ошибок следует учитывать, что некоторые старые функции MS-DOS возвращают при ошибке в регистре AX значение 0FFh. Начиная с версии MS-DOS 2.0 в случае возникновения ошибки устанавливается флаг переноса. При этом код ошибки записывается в регистр AX. Однако для более полной диагностики причины ошибки следует использовать функцию 59h прерывания INT 21h. |