Теоретические положения:
Для доступа к информации, хранящейся на дисках ПЭВМ, используется специальная группа дисковых функций MS-DOS. В эту группу входят прерывания, предназначенные для выполнения основных функций операционной системы, в том числе для выполнения операций с логическими дисками, файлами и каталогами. Дисковые функции DOS обладают достаточной полнотой и универсальностью для решения любых задач в реальном режиме DOS. Они могут применяться и в режиме линейной адресации памяти, но информацию в расширенную память приходиться пересылать через промежуточный буфер в первом мегабайте адресного пространства процессора.
Ниже описаны функции DOS, выполняющие основные операции над логическими дисками, каталогами и файлами. При описании используются следующие термины:
· строка ASCIIZ – текстовая строка в ASCII-коде, которая завершается нулевым значением;
· дескриптор файла – уникальный номер, который операционная система присваивает создаваемому или открываемому файлу в качестве идентификатора (чтобы потом обращаться к файлу по этому номеру – вплоть до его закрытия).
Группа функций для работы с файловой системой появилась в ранних версиях MS-DOS и сохранилась с тех пор практически без изменений. Для определения успешности выполнения таких функций используется флаг регистра признаков CF:
· в случае успешного завершения операции флаг CF сбрасывается в 0;
· в случае ошибки флаг CF устанавливается в 1.
По мере развития MS-DOS в набор функций постоянно вносились дополнения, упрощающие выполнение тех или иных операций и улучшающие контроль за их выполнением. Усовершенствованные средства контроля: в случае ошибки кроме установки флага CF выдают в регистре АХ код ошибки, по которому можно определить причину ее возникновения. Возможные значения некоторых кодов ошибок приведены в таблице 6.7. Однако следует учитывать, что содержимое регистра АХ в случае успешного завершения данных функций не сохраняется.
Таблица 6.7 . Значения расширенных кодов ошибки
Код ошибки | Расшифровка кода |
00h | Нет ошибки |
01h | Неверный номер функции |
02h | Файл не найден |
03h | Путь не найден |
05h | Доступ запрещен |
06h | Недопустимый дескриптор |
08h | Недостаточно памяти |
0Bh | Недопустимый формат |
0Сh | Недопустимый код доступа |
0Dh | Недопустимые данные |
0Fh | Недопустимый дисковод |
10h | Попытка удалить текущий каталог |
12h | Больше нет файлов |
13h | Диск защищен от записи |
16h | Неизвестная команда |
1Dh | Ошибка записи |
1Eh | Ошибка чтения |
24h | Разделяемый буфер переполнен |
26h | Невозможно завершить операцию с файлом |
27h | Недостаточно места на диске |
35h | Не найдено сетевое имя |
36h | Сеть занята |
37h | Сетевое устройство больше не существует |
39h | Аппаратная ошибка сетевого адаптера |
43h | Сетевое имя не найдено |
50h | Файл уже существует |
52h | Каталог не может быть создан |
5Ah | Требуемый компонент системы не установлен |
Далее приведены основные функции прерывания Int 21h, используемые при работе с файловой системой.
Прерывание Int 21h, функция OEh: сменить текущий логический диск
Функция позволяет выбрать логический диск.
Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 0Eh;
· в AL – код логического диска (0 – А:, 1 – В: и т. д.).
После завершения операции функция возвращает в регистре AL максимально возможный в данной системе номер логического дисковода (определяется параметром LASTDRIVE в файле CONFIG. SYS).
Прерывание Int 21h, функция 19h: определить номер текущего дисковода
Функция определяет номер дисковода, который в данный момент считается текущим, то есть используется по умолчанию.
Перед вызовом прерывания требуется записать в регистр АН значение 19h.
После завершения операции функция возвращает в регистре AL код логического диска (0 – А:, 1 – В: и т. д.).
Прерывание Int 21h, функция 36h: определить объем свободного места на диске
Функция определяет объем свободного места на заданном логическом диске. Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 36h;
· в AL – код логического диска (0 – А:, 1 – В: и т. д.).
В случае ошибки в регистре АХ будет возвращен код OFFFFh (недопустимый код логического диска).
В случае успешного завершения операции функция возвращает:
· в АХ – число секторов в кластере;
· в ВХ – число свободных кластеров;
· в СХ – число байтов в секторе;
· в DX – полное число кластеров на диске.
Объем свободного пространства определяется произведением содержимого регистров АХ, ВХ и СХ, а полный объем диска в байтах – произведением АХ, СХ и DX.
Прерывание Int 21h, функция 39h: создать подкаталог
Функция создает в текущем дереве каталогов новый подкаталог.
Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 39h;
· в DS:DX – указатель на полную спецификацию каталога в виде строки ASCIIZ (должны существовать все каталоги на заданном пути, кроме последнего; вызов функции завершается ошибкой, если родительский каталог заполнен и является корневым).
Возможные коды ошибки: 03h, 05h.
Прерывание Int 21h, функция 3Ah: удалить подкаталог
Функция удаляет указанный подкаталог.
Каталог должен быть пустым, иначе выдается сообщение об ошибке. Поэтому перед удалением каталога нужно его очистить, удалив все имеющиеся в нем файлы и каталоги.
Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 3Ah;
· в DS:DX – указатель на полную спецификацию удаляемого каталога в виде строки ASCIIZ.
Возможные коды ошибки: 03h, 05h, 06h, 10h.
Прерывание Int 21h, функция 3Bh: перейти в другой каталог
Функция создает в текущем дереве каталогов новый подкаталог.
Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 3Bh;
· в DS:DX – указатель на полную спецификацию заданного каталога в виде строки ASCIIZ.
Возможный код ошибки: 03h.
Прерывание Int 21h, функция 3Ch: создать файл
Функция создает файл для записи. Если файл уже существует, то его размер усекается до 0.
Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 3Ch;
· в СХ – атрибуты создаваемого файла (табл. 6.8);
· в DS: DX – указатель на имя файла в виде строки ASCIIZ.
В случае успешного завершения операции функция возвращает в регистре АХ дескриптор файла.
Возможные коды ошибки: 03h,04h,05h.
Таблица 6.8. Формат слова атрибутов файла
Номер разряда | Описание |
0 | Только для чтения |
1 | Скрытый |
2 | Системный |
3 | Метка тома (разряд может быть установлен только при считывании атрибутов; при создании файла или изменении атрибутов значение разряда должно быть равно 0) |
4 | Каталог (разряд может быть установлен только при считывании атрибутов; при создании файла или изменении атрибутов значение разряда должно быть равно 0) |
5 | Признак архивации |
6-15 | Зарезервированы, должны быть равны 0 |
Прерывание Int 21h, функция 3Dh: открыть существующий файл
Функция открывает файл для чтения, записи или дозаписи информации. Указатель при этом устанавливается в начало файла.
Перед вызовом прерывания требуется записать в регистры следующие значения:
· в АН – значение 3Dh;
· в AL - режимы доступа (табл. 6.9);
· в DS:DX – указатель на имя файла в виде строки ASCIIZ.
В случае успешного завершения операции функция возвращает в регистре АХ дескриптор файла.
Возможные коды ошибки: 01h, 02h, 03h, 04h, 05h, 0Ch.
Таблица 6.9. Формат байта режимов доступа
Номер разряда | Описание |
0-2 | Режим доступа: 000 – только для чтения; 001 – только для записи; 010 – для чтения и записи |
3 | Зарезервирован, должен быть равен 0 |
4-6 | Режим разделения файлов: 000 – режим совместимости; 001 – другим программам запрещен любой доступ к файлу; 010 – другим программам запрещена запись в файл; 011 – другим программам запрещено чтение из файла; 100 – другим программам разрешен полный доступ к файлу |
7 | Флаг наследования: 0 – дочерний процесс наследует дескриптор; 1 – не наследует. |
Прерывание Int 21h, функция 3Eh: закрыть файл
Функция сбрасывает на диск содержимое всех буферов, обновляет информацию в каталоге, а затем освобождает дескриптор файла (после этого дескриптор может быть присвоен другому файлу).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 |


