Таблица 6



Таблица 6

1Локализация ошибки не может быть определена (система не знает, где произошла ошибка).
2Ошибка произошла в блочном устройстве (диск или магнитная лента).
3Ошибка связана с сетью.
4Ошибка произошла в символьном устройстве, например, в принтере.
5Ошибка связана с оперативной памятью.

Если Ваша программа составлена на языке ассемблера, то после обращения к DOS через прерывание следует проверить состояние флага переноса: int 21h jc error

Программы, составленные на языке Си, обращаются к прерываниям DOS обычно с помощью таких функций, как intdos, int86, intdosx и т.д. Для передачи параметров используются структуры REGS, WORDREGS, BYTEREGS, SREGS. Они описаны в файле dos.h, для использования этих структур программа должна содержать строку: include <dos.h>

Значение флага переноса записывается в переменную cflag, определенную в структуре WORDREGS. Эта структура входит в объединение REGS: union REGS { struct WORDREGS x; struct BYTEREGS h; } struct WORDREGS { unsigned int ax; unsigned int bx; unsigned int cx; unsigned int dx; unsigned int si; unsigned int di; unsigned int cflag; } struct BYTEREGS { unsigned char al, ah; unsigned char bl, bh; unsigned char cl, ch; unsigned char dl, dh; }

Проверка переменной cflag может быть выполнена, например, таким образом: union REGS inregs, outregs; intdos(&inregs, &outregs); if( outregs.x.cflaf != 0 ) error();

Код ошибки при этом содержится в переменной outregs.x.ax.

Приведем пример программы, которая стирает каталог с именем DIR в текущем каталоге и, в случае ошибки, выводит расширенную информацию об ошибке, класс ошибки, код предполагаемых действий и код локализации ошибки: #include <dos.h> #include <stdio.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( "Ошибка при удалении каталога: %d", outregs.x.ax); // Получаем расширенную информацию об ошибке // с помощью функции 0x59 прерывания INT 21h. inregs.h.ah = 0x59; inregs.x.bx = 0; // Сохраняем регистры в стеке, т.к. их содержимое // изменится _asm { push ds push es push si push di } intdosx(&inregs, &outregs, &segregs); _asm { pop di pop si pop es pop ds } // Выводим расширенную информацию об ошибке. printf("\nРасширенный код ошибки: %d" "\nКласс ошибки: %d" "\nПредполагаемые действия: %d" "\nЛокализация ошибки: %d", outregs.x.ax, outregs.h.bh, outregs.h.bl, outregs.h.ch); } }

При составлении программ обработки ошибок следует учитывать, что для DOS версии 1.0 при некоторых ошибках функции DOS возвращают в регистре AX значение 0FFh. Начиная с версии DOS 2.0, при ошибке устанавливается флаг переноса, код ошибки записывается в регистр AX. Однако для более полной диагностики причины ошибки следует использовать функцию 59h прерывания INT21h.

Если Ваша программа, составленная на языке Си, вызывает функции DOS неявным образом (через функции стандартной библиотеки транслятора, такие как fprintf, puts и т.д.), то можно воспользоваться средствами обработки ошибок, входящими в состав стандартной библиотеки.

Когда при обращении к функциям DOS средствами стандартной библиотеки транслятора Си возникает ошибка, то в глобальную переменную errno записывается код ошибки.

Возможны следующие коды ошибок (они описаны в файле errno.h и stdlib.h):



- Начало - - Назад - - Вперед -