MS-DOS для программиста
© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.
Когда программа обращается к MS-DOS для
выполнения какой-либо операции, она должна
вызвать соответствующее прерывание, загрузив
перед этим все необходимые параметры в регистры
процессора. Если выполнение операции невозможно
по каким-то причинам (неправильные параметры,
устройство неработоспособно, запрашиваемая
операция не поддерживается текущей версией MS-DOS и
т. д.), то для большинства функций MS-DOS
устанавливается признак ошибки - флаг переноса.
При этом регистр AX содержит код ошибки.
Перечислим коды ошибок, возвращаемые программе
через регистр AX.
Код |
Описание |
01 |
Указан неправильный код функции |
02 |
Файл не найден |
03 |
Путь не найден |
04 |
Слишком много открытых файлов |
05 |
Доступ запрещен |
06 |
Неправильный идентификатор |
07 |
Разрушен блок управления памятью |
08 |
Недостаточно памяти |
09 |
Неправильный адрес блока памяти |
0Ah |
Неправильная среда |
0Bh |
Неправильный формат |
0Ch |
Неправильный доступ |
0Dh |
Неправильные данные |
0Eh |
Зарезервировано |
0Fh |
Ошибка при указании диска |
10h |
Невозможно удалить текущий
каталогтекущий каталог |
11h |
Другое устройство |
12h |
Больше нет файлов |
Для MS-DOS версии 3.0 и более поздних версий
обработка ошибок значительно расширена. Введена
функция 59h, предназначенная для получения
дополнительной информации об ошибках.
При вызове этой функции регистр BX должен
содержать индикатор уровня анализа ошибок,
который должен быть равен 0. Кроме расширенного
кода ошибки, возвращаемого в регистре AX,
программа может получить класс ошибки (регистр
BH), код предполагаемых действий (регистр BL),
локализацию ошибки (регистр CH).
К сожалению, эта функция разрушает содержимое
регистров CL, DX, SI, DI, BP, DS, ES. Программа,
использующая функцию 59h прерывания INT 21h,
должна позаботиться о сохранении содержимого
этих регистров.
Расширенный код ошибки, возвращаемый в
регистре AX, может принимать значения, указанные
ниже. Коды от 1 до 12h эквивалентны кодам,
рассмотренным ранее и второй раз не приводятся.
Код |
Описание |
13h |
Выполнена попытка записи на защищенный
от записи диск |
14h |
Указан неизвестный идентификатор
устройства |
15h |
Диск не готов |
16h |
Неизвестная команда |
17h |
Ошибка циклического кода проверки |
18h |
Неправильная длина структуры запроса |
19h |
Ошибка при поиске |
1Ah |
Неизвестен тип среды носителя данных |
1Bh |
Сектор не найден |
1Ch |
Кончилась бумага в принтере |
1Dh |
Ошибка записи |
3Eh |
Ошибка чтения |
1Fh |
Общая ошибка |
20h |
Ошибка при доступе к совместно
используемому файлу |
21h |
Нарушение блокировки файла |
22h |
Неправильный диск |
23h |
FCBFCB недоступен (слишком много блоков FCB) |
24h |
Переполнился буфер, предназначенный для
совместного доступа к файлам |
25h |
Несоответствие кодовых страниц |
26h |
Ошибка при обработке конца файла |
27h |
Переполнение диска |
28h - 31h |
Зарезервировано |
32h |
Сетевая функция не поддерживается |
33h |
Удаленный компьютер не отвечает |
34h |
Дублирование имени в сети |
35h |
Сетевое имя не найдено |
36h |
Сеть занята |
37h |
Сетевое устройство больше не существует
|
38h |
Слишком много команд |
39h |
Ошибка в аппаратуре сетевого адаптера |
3Ah |
Неправильный ответ из сети |
3Bh |
Непредусмотренная ошибка сети |
3Ch |
Несовместимый удаленный адаптер |
3Dh |
Переполнена очередь печати |
3Eh |
Мало места в очереди печати |
3Fh |
Печать отменена |
40h |
Сетевое имя было удалено |
41h |
Доступ к сетевому ресурсу запрещен |
42h |
Неправильный тип сетевого устройства |
43h |
Сетевое имя не найдено |
44h |
Слишком много сетевых имен |
45h |
Слишком много сеансов связи |
46h |
Совместное использование ресурсов в
сети временно отменено |
47h |
Сетевой запрос отвергнут |
48h |
Переадресация приостановлена |
49h - 4Fh |
Зарезервировано |
50h |
Файл уже существует |
51h |
Дублирование блока FCBFCB |
52h |
Невозможно создать дескриптор в
каталоге |
53h |
Ошибка обработчика критических ошибок
INT 24hINT 24h |
54h |
Слишком много переназначений |
55h |
Двойное переназначение |
56h |
Неправильный пароль |
57h |
Неправильный параметр |
58h |
Ошибка при записи данных в сети |
59h |
Нет такой функции в сети |
5Ah |
Не установлен необходимый компонент
системы |
Класс ошибки, передаваемый в регистре BH,
содержит информацию, которая поможет вам
обработать данную ошибку:
Класс ошибки |
Описание |
1 |
Недостаточно ресурсов: блоков FCBFCB,
памяти и т. д. |
2 |
Временная ситуация, попробуйте
повторить операцию позже |
3 |
Нет прав доступа |
4 |
Внутренняя ошибка MS-DOS |
5 |
Ошибка аппаратуры |
6 |
Системная ошибка MS-DOS |
7 |
Ошибка в прикладной программе |
8 |
Файл или объект не найден |
9 |
Неправильный формат файла или объекта |
10 |
Файл или объект заблокирован |
11 |
Ошибка носителя данных |
12 |
Файл или объект уже существует |
13 |
Прочие ошибки |
Код предполагаемых действий, передаваемый
через регистр BL, поможет вашей программе
правильно обработать ошибку. Приведем список
кодов предполагаемых действий:
Код |
Рекомендуемые действия |
1 |
Повторить операцию позже. Можно
спросить пользователя, желает он повторить
операцию или завершить работу программы |
2 |
Повторить предыдущую операцию после
небольшой паузы. Если ошибка не исчезла, следует
спросить пользователя, будет он ждать и дальше,
или следует завершить работу программы |
3 |
Если пользователь вводил какие-то
данные для MS-DOS, следует попросить его ввести эти
данные еще раз (например, пользователь мог
указать неправильный идентификатор диска или
путь доступа к файлу) |
4 |
Аварийно завершить работу прикладной
программы с выполнением всех обычных
завершающих действий (закрытие файлов, сброс
буферов на диск, освобождение блоков памяти и т.
д.) |
5 |
Немедленный выход из программы без
выполнения завершающих действий. Система
находится в непредсказуемом состоянии |
6 |
Следует игнорировать ошибку |
7 |
Повторить операцию, после того как
пользователь выполнит требуемые действия
(установит дискету и т. п.) |
Сведения о локализации ошибки передаются в
регистре CH. Приведем список кодов локализации:
Код |
Место, где произошла ошибка |
1 |
Система не знает, где произошла ошибка |
2 |
В устройстве, выполняющем обмен данными
отдельными блоками (диск или магнитная лента) |
3 |
Ошибка связана с сетью |
4 |
В символьном устройстве, например, в
принтере |
5 |
Ошибка связана с оперативной памятью |
Если ваша программа составлена на языке
ассемблера, то после обращения к MS-DOS через
прерывание следует проверить состояние флага
переноса:
int 21h
jc error
MS-DOS имеет еще одно средство для обработки
ошибок - обработчик критических ошибок (Critical Error
Handler). Этот модуль вызывается MS-DOS, когда она
получает сообщение об ошибке от драйвера
устройства.
Модуль выдает на экран хорошо известное вам
сообщение:
Abort, Retry, Fail?
Это сообщение обычно появляется тогда, когда вы
забываете вставить дискету или начинаете
печатать при отключенном принтере.
Прикладные программы могут подключать свой
модуль обработки критических ошибок вместо
стандартного модуля.
А теперь расскажем более подробно о том, как
программа может вызывать прерывания MS-DOS.
|