Запись в файл

Для записи в файл используется функция 0x40. Она имеет те же аргументы, что и функция чтения файла:

Ввод:

Запись в файл:

АН = 0x40

ВХ = дескриптор файла

DS:DX = указатель на буфер

СХ = количество байтов, которые нужно записать

Вывод:

В случае успеха:

CF = 0

АХ = фактическое количество байтов, записанных

в файл

При ошибке:

CF = 1

АХ= код ошибки

В DS:DX нужно указать адрес буфера, содержащий данные, которые нам нужно записать в файл. А в СХ нужно занести количество байтов, которые нужно записать: обычно это длина буфера. Если вызов прошел успешно, то в АХ окажется количество байтов, записанных в файл. Если оно отличается от требуемого, то, возможно, нет свободного места на диске. Теперь у нас достаточно знаний, чтобы вывести текстовый файл text . tx t на экран.

Прежде всего, нам необходимо открыть файл text . txt , используя функцию 0x3D. Потом мы будем читать из него блоки одинакового размера при помощи функции 0x3F, пока количество считанных байтов не станет равно нулю. Прочитанный блок мы будем выводить на стандартный вывод функцией 0x40. Перед завершением программы мы закроем файл. После запуска программы текст из файла text . tx t будет выведен на

экран. Мы можем модифицировать нашу программу так, чтобы вместо записи на стандартный вывод она записывала прочитанные данные в другой файл. Тогда мы получим простейшую программу копирования файла.

1.5 Открытие/создание файла

В отличие от функции 0x3D функция Ох6С не только открывает файл, но и создает новый файл, если при открытии файла обнаружится, что файла с таким именем не существует.

Ввод:

Открытие/создание файла

АН = ОхбС

AL = 0x00 (всегда должен быть 0)

ВХ = массив битов для расширенного режима

CX = атрибуты для нового файла

DX = массив битов для требуемой операции

DS;DX = указатель на имя файла

Вывод:

Успех:

CF = 0

АХ = идентификатор открытого файла

CX = отчет об операции (см. ниже)

Ошибка:

CF = 1

АХ • код ошибки

Данная функция позволяет использовать несколько режимов открытия файлов: открытие существующего файла, создание нового файла с его последующим открытием и открытие файла с усечением его длины до нуля (открытие для перезаписи).

Требуемый режим мы можем указать в регистре DX. Можно использовать следующие комбинации битов при системном вызове.

4 младших бита (в регистре DL):

• DL = 0000b — выйти с ошибкой, если файл существует (можно использовать для проверки существования файла).

• DL = 0001b — открыть файл, если он существует.

• DL = 0010b — открыть файл для перезаписи (удалить все содержимое), если он существует.

4 старших бита (в регистре DH):

• DH = 0000b — выйти с ошибкой, если файл не существует.

• DH = 0001b — создать файл, если он не существует.

Когда мы будем вызывать функцию ОхбС в программе копирования файла, нам нужно записать в DX значение 0x0012. В этом случае файл назначения будет создан и открыт при условии, что он не существует или усечен и открыт, если файл существует.

В регистр СХ (это тоже массив битов) нужно занести атрибуты вновь создаваемого файла. DOS — не UNIX, она не поддерживает ни имени владельца, ни прав доступа, поэтому набор атрибутов в DOS крайне ограничен:

• Бит 0: если 1, то будет установлен атрибут «только чтение».

• Бит 1: если 1, то будет установлен атрибут «скрытый».

• Бит 2: если 1, то будет установлен атрибут «системный».

• Бит 3: если 1, то это метка тома.

158 Глава 10. Программирование в DOS

• Бит 4: если 1, то это каталог.

• Бит 5: если 1, то будет установлен атрибут «архивный».

• Биты 6-15: зарезервированы для дальнейшего использования.

В большинстве случаев в регистр СХ нужно помещать значение 0x20: создание обычного архивного файла.

В регистре ВХ указываются флаги расширенного режима. Для нас пока имеют значение только два младших бита.

• ВХ = 0: файл открывается только для чтения.

• ВХ = 1: файл открывается только для записи.

• ВХ = 2: файл открывается для чтения и для записи.

После успешного завершения системного вызова (CF=0) регистр АХ будет содержать дескриптор файла (как и в случае с функцией 0x3D). В СХ будет возвращен «отчет» о выполненной операции:

• СХ = 1: файл был открыт.

• СХ = 2: файл был создан и открыт.

• СХ = 3: файл был перезаписан и открыт.

Модифицируем нашу программу листинг 10.6 так, чтобы она копировала файлы. Файл назначения будем создавать (или перезаписывать) функцией ОхбС. Осталось только передать полученный из нее дескриптор файла назначения в то место программы, где происходит запись в файл.

 

 

2 Задание по лабораторной работе

 

Разработать программу на Assembler, выполняющую следующие действия:

1. Создание файла;

2. Открытие файла;

3. Запись информации в файл;

4. Чтение информации из файла;

5. Закрытие файла;

6. Вывод файла на экран.