Иллюстрированный самоучитель по задачам и примерам Assembler

Работа с файлами в MS DOS (имена 8.3). Создание, открытие, закрытие и удаление файла.

В основе файловой системы MS DOS лежит древовидная структура каталогов. Корень этой структуры представляет собой совокупность ограниченного числа дескрипторов, описывающих файлы и каталоги (подкаталоги) следующего уровня. Подкаталог представляет собой файл особого типа, который содержит дескрипторы файлов и подкаталогов очередного нижележащего уровня. В отличие от корневого каталога количество дескрипторов в подкаталоге не ограничено и определяется только размером диска. Дескриптор представляет собой экземпляр структуры размером 32 байта. Поля этой структуры содержат различную информацию о файле: идентификатор файла и его характеристики – дата и время создания (модификации), номер начального кластера, длина файла и его атрибуты.

Для использования файла в программе необходимо выполнить следующие операции:

  • создание нового файла;
  • открытие существующего файла;
  • запись/чтение в/из файл(а);
  • закрытие файла.

Операционная система MS DOS поддерживает эти операции с помощью набора функций прерывания 21h. Кроме этих функций данное прерывание содержит функции для работы с каталогами:

  • создать каталог;
  • удалить каталог;
  • сменить каталог.

Существует также ряд других функций для работы с файловой системой, в том числе для поиска файлов и получения информации о них.


Прежде чем использовать файл в программе, его необходимо открыть с помощью функции 3dh прерывания 21h. Если файл не существует, то перед открытием его нужно создать. Оба эти действия выполняются одной из следующих функций: 3ch, 5bh, 5ah, 6ch.

Создание файла с усечением существующего до нулевой длины

Вход: АН = 3Ch;
CX = атрибуты файла (значения битов: 0=1 – только чтение; 1= 1 – скрытый файл;
2=1 – системный файл; 3=0 – игнорируется;
4=0 – зарезервирован (каталог), должен быть равен 0;
5 – бит архивации; 6= 0 – резерв;
7=1 – общий файл в системе Novell Netware; 8…15=0 – резерв);
DS:DX – ASCIZ-имя файла.
Выход: CF=O – АХ = дескриптор файла;
CF=1 – АХ = код ошибки (3 – нет такого пути; 4 – нет свободного дескриптора файла;
 5 – доступ отказан).
хоr сх.сх:атрибуты файла – обычный файл Ids dx,point_fname:
:формируем указатель на имя файла movah.5bh:номер функции DOS
int21h открываем файл
jnc ml: обойдем открытие файла
moval,02h;режим доступа
movah.3dh;номер функции DOS
int 21h: открываем файл
jc exit:переход, в случае ошибки
mi::действия при успешном открытии файла:
mov handle.ax:сохраним дескриптор файла

Открытие или создание файла с расширенными возможностями

Функция 6Ch появилась в последних версиях MS DOS (DOS 4.0+). С ее появлением устраняется необходимость отслеживать существование создаваемого файла. Для корректной работы достаточно задать нужные значения в соответствующих регистрах. Анализ возможных значений показывает, что данная функция фактически заменяет существовавшие до этого функции создания и открытия файлов.

Вход: АХ = 6C00h; BL = флаги – режим открытия (значения битов: 7 – наследование;
4-6 – режим разделения; 3=0 – резерв; 0-2 – режим доступа);
ВН = флаги (значения битов: 6=0 – использовать стандартную для MS DOS буферизацию;
6=1 – отменить стандартную для MS DOS буферизацию;
5=0 – использовать обычный обработчик ошибок (int 24h);
5=1 – не использовать обычный обработчик ошибок (int 24h),
:для выяснения причины ошибки использовать функцию 59h int 21h);
CX = атрибуты создаваемого (и только) файла;
DL = действия, если файл существует или не существует
;(значения бит: 0-3 – действие, если файл существует (0000 – вернуть ошибку;
0001 – открыть файл; 0002 – открыть файл без сохранения существующего);
4-7 – действие, если файл не существует (0000 – вернуть ошибку;
0001 – открыть файл; 0002 – создать и открыть файл);
DH = 00h – резерв; DS:SI – адрес строки с ASCIZ-именем файла.
Выход: CF = 0 – успешное выполнение функции: АХ = дескриптор файла, СХ = состояние:
;(0 – файл открыт; 1 – файл создан и открыт;
2 – файл открыт без сохранения содержимого существующего файла); CF = 1 – АХ = код ошибки.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.