На этом шаге мы рассмотрим функции, осуществляющие создание файла, запись данных и его закрытие.
Для ссылки на каждый дисковый файл программа должна содержать правильно составленный блок управления файлом. Операции ввода-вывода на диск требуют установки адреса блока FCB в регистре DX. Доступ к полям блока FCB осуществляется по этому адресу с помощью регистровой пары DS:DX.
Для создания нового файла программа использует функцию 16H в прерывании DOS INT 21H следующим образом:
MOV AH,16H ; Создание LEA DX,FILE ; дискового файла. INT 21H ; Вызов DOS-прерывания.
DOS осуществляет поиск имени и типа файла, взятого из соответствующих полей FCB, в оглавлении. Если элемент оглавления, содержащий необходимое имя и тип, будет найден, то DOS очищает найденный элемент для нового использования. Если такой элемент отсутствует в текущем каталоге, то DOS его "создает". Затем операция устанавливает размер файла в 0 и "открывает" файл. На этапе открытия происходит проверка доступного дискового пространства. Ее результат устанавливается в регистре AL:
При открытии также устанавливается в FCB номер текущего блока - 0 и размер записей (по умолчанию) - 128 (80H) байтов. Прежде чем начать запись в файл, можно заменить это значение по умолчанию на требуемый размер записей.
Для осуществления обмена данными с файлом используется специальная область, называемая областью передачи данных (DTA - Disk Transfer Area). Так, например, для записи данных в файл нужно разместить эти данные в DTA, откуда, при выполнении соответствующей команды, они будут взяты и помещены в файл.
Так как блок FCB содержит размер записей, то в DTA не требуется устанавливать ограничитель конца записи. С помощью функции 1AH необходимо сообщить DOS адрес DTA. В любой момент времени может быть активна только одна область DTA. В следующем примере устанавливается адрес DTA:
MOV AH,1AH ; Установка адреса LEA DX,DTAname ; DTA. INT 21H ; Вызов DOS-прерывания.
Для последовательной записи на диск существует функция 15H:
MOV AH,15H ; Последовательная LEA DX,FILE ; запись. INT 21H ; Вызов DOS-прерывания.
Операция записи использует информацию из блока FCB и адрес текущего буфера DTA. Если длина записи равна или кратна размеру кластера, то запись заносится на диск. В противном случае записи заполняют буфер и затем его содержимое записывается на диск. Например, если длина каждой записи составляет 128 байтов, то буфер заполняется четырьмя записями (4*128=512) и затем он записывается в кластер (при условии, что размер кластера совпадает с размером сектора).
После успешного занесения записи на диск DOS увеличивает в блоке FCB размер файла на размер записи и текущий номер записи на 1. Когда номер текущей записи достигает 128, происходит сброс этого значения в 0 и в FCB увеличивается номер текущего блока на 1. Операция возвращает в регистре AL следующие коды:
Для закрытия файла используется функция 10H:
MOV AH,10H ; Закрыть LEA DX,FILE ; файл. INT 21H ; Вызов DOS-прерывания.
Эта операция записывает на диск данные, которые ещё остались в дисковом буфере DOS, и изменяет в соответствующем элементе оглавления, дату и размер файла. В регистре AL возвращаются следующие значения:
На следующем шаге мы рассмотрим последовательное чтение из файла.