Прежде чем использовать файл в программе, его необходимо
открыть с помощью функции 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 — доступ
отказан).
хогсх.сх :атрибуты файла - обычный файл 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 — АХ
= код ошибки.
Следующий фрагмент программы показывает вариант применения функции 6Ch.
:prg07_04.asm - программа демонстрации
открытия или создания файла :с расширенными возможностями в текущем
каталоге функцией 6Сп.
.data
handle dw 0 :дескриптор файла
filename db 'my_file.txt'.0
point_fname dd filename
.code
хогсх.сх атрибуты файла - обычный файл
movbx.2 :режим доступа обычный - доступ для чтения-записи
movdx.l :если файл существует, то открыть его. в обратной случае вернуть ошибку
(для эксперимента)
Ids si .point_fname-.формируем указатель на имя файла movah.6ch
:номер функции DOS int 21h открываем файл jnc ml ;если файл существовал,
то переход movdx.lOh -.открыть файл movah.6ch :номер функции DOS int
21h :открываем файл jc exit -.переход в случае ошибки ml: :действия при
успешном открытии файла: mov handle.ах :сохраним дескриптор файла
Закрытие файла
В конце работы с файлом его нужно закрыть. Но это
действие не является обязательным, так как функция 4сп, которая
завершает выполнение программы, в числе прочих действий выполняет и
закрытие всех файлов. Вход: АН = 3Eh; BX = дескриптор файла, полученный
при его открытии. Выход: CF = 0 — АХ = не определен; CF = 1 — АХ = код
ошибки: 6 — недопустимый
дескриптор.
Во время закрытия файла выполняются все незаконченные операции
записи на диск в элементе каталога, соответствующего файлу,
модифицируются различные поля, в том числе поля времени и даты
устанавливаются в текущее время.
;prg07_05.asm - программа демонстрации закрытия файла функцией 3Eh.
:.........
.data
handle dw 0 :дескриптор файла filename db 'my_file.txt',О point fname dd filename
;......:
.code :*......
хогсх.сх :атрибуты файла - обычный файл
Ids dx.point_fnanve :фориируем указатель на имя файла
movah.5bh :номер функции DOS
int 21h :открываем файл
jnc ml ;обойдем открытие файла
moval.02h :режим доступа
1movah.3dh -.номер функции DOS
int 21h :открываем файл
jc exit :переход в случае ошибки
ml: :действия при успешном открытии файла:
mov handle.ах ;сохраним дескриптор файла
т2: ;закрываем файл:
В случае задания имени, как в примере выше, файл будет
создан в корневом каталоге текущего диска. Для того чтобы разместить
файл в конкретном каталоге, необходимо указать полный путь к нему с
завершающим символом ' \' и 13 нулевыми байтами на конце, например:
filename db 'e:\asm_on_a\'.13 dup(0),0