double arrow

Создание дискового файла

Файловый номер

Данные в формате ASCIIZ

Запись файла на диск

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

PATHNM1 DB 'B:\TEST.ASM',0

PATHNM2 DB 'C:\UTILITY\NU.EXE',0

Обратная косая (или прямая косая) используются в качестве разделителя. Нулевой байт (zero) завершает строку (отсюда название ASCIIZ формата). Для прерываний, использующих в качестве параметра ASCIIZ строку, адрес этой строки загружается в регистр DX, например, командой LEA DX,PATHNM1.

Операции создания и открытия файла требуют загрузки в регистр AX двухбайтового числа, представляющего собой файловый номер. Стандартные устройства не нуждающиеся в операции открытия и могут использовать непосредственно файловые номера: 0 - ввод, 1 - вывод, 2 - вывод сообщений об ошибках, 3 - внешнее устройство, 4 - принтер.

Для доступа к диску при создании или открытии файла используется ASCIIZ строка и функция 3Ch или 3Dh прерывания DOS INT21h . Успешная операция устанавливает флаг CF в 0 и помещает файловый номер в регистр AX. Этот номер необходимо сохранить в элементе данных DW и использовать его для всех последующих операций над дисковым файлом. При неуспешной операции флаг CF устанавливается в 1, а в регистр AX помещается код ошибки, зависящий от операции.

Для создания нового файла или переписывания старого файла используется функция 3Ch. При этом регистр DX должен содержать адрес ASCIIZ-строки, а регистр CX - необходимый атрибут; для обычного файла значение атрибута - 0.

Рассмотрим пример создания обычного файла:

MOV AH,3CH ; Запрос на создание

MOV CX,00 ; обычного файла

LEA DX,PATHNM1 ; ASCIIZ строка

INT 21H ; Вызов DOS

JC error ; Переход по ошибке

MOV HANDLE1,AX ; Сохранение файлового номера в DW

При правильном открытии операция создает элемент оглавления с данным атрибутом, очищает флаг CF и устанавливает файловый номер в регистре AX. Этот номер должен использоваться для всех последующих операций. Если создаваемый файл уже существует (т.е. имя файла присутствует в оглавлении), то длина этого файла устанавливается в 0 для перезаписи.

В случае возникновения ошибки операция устанавливает флаг CF в 1 и помещает в регистр AX код возврата: 03, 04 или 05. Код 05 свидетельствует либо о переполнении оглавления, либо о защите существующего файла атрибутом "только чтение". При завершении операции необходимо сначала проверить флаг CF, так как при создании файла возможна установка в регистре AX файлового номера 0005, который можно легко спутать с кодом ошибки 05 (нет доступа).

Для записи файла используется функция 40h. При этом в регистре BX должен быть установлен файловый номер, в регистре CX - число записываемых байт, а в регистре DX - адрес области вывода. В следующем примере происходит запись 256 байт из области OUTREC:

HANDLE1 DW ?

OUTREC DB 256 DUP (' ')

MOV AH,40H ; Запрос записи

MOV BX,HANDLE1 ; Файловый номер

MOV CX,256 ; Длина записи

LEA DX,OUTREC ; Адрес области вывода

INT 21H ; Вызов DOS

JC error2 ; Проверка на ошибку

CMP AX,256 ; Все байты записаны?

JNE error3

Правильная операция записывает из памяти на диск все данные (256 байт), очищает флаг CF и устанавливает в регистре AX число действительно записанных байтов. Если диск переполнен, то число записанных байтов может отличаться от заданного числа. В случае неправильной операции флаг CF устанавливается в 1, а в регистр AX заносится код 05 (нет доступа) или 06 (ошибка файлового номера).

После завершения записи файла необходимо установить файловый номер в регистр BX и, используя функцию 3Eh, закрыть файл. Эта операция записывает все оставшиеся еще данные из буфера на диск и корректирует оглавление и таблицу FAT.

MOV AH,3EH ; Запрос на закрытие файла

MOV BX,HANDLE1 ; Файловый номер

INT 21H ; Вызов DOS

В случае ошибки в регистре AX устанавливается код 06 (неправильный файловый номер).


Сейчас читают про: