Шаг 63.
Функции расширенной версии DOS для работы с файлами. Основные операции с файлами

    На этом шаге мы рассмотрим основные операции над файлами.

    Перечислим основные операции, организующие работу с файлами в расширенной версии DOS.

    1. Создание файла (функция 3CH). Регистр DX должен содержать адрес ASCIIZ-строки, а регистр CX - необходимый атрибут (для обычного файла значение атрибута равно 0):

    MOV  AH,3CH         ; Запрос на создание
    MOV  CX,00          ; обычного файла.
    LEA  DX,PATHNM1     ; ASCIIZ строка.
    INT  21H            ; Вызов DOS-прерывания.
    JC  error           ; Переход по ошибке.
    MOV  HANDLE1,AX     ; Сохранение файлового номера.

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

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

    2. Запись файла (функция 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 (ошибка файлового номера).

    3. Закрытие файла (функция 3EH). В регистре BX должен находиться файловый номер. Эта операция записывает все оставшиеся еще данные из буфера на диск, корректирует оглавление и таблицу FAT:

    MOV  AH,3EH       ; Запрос на закрытие файла.
    MOV  BX,HANDLE1   ; Файловый номер.
    INT  21H          ; Вызов DOS-прерывания.

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

    4. Чтение дискового файла (функция 3DH). Эта операция проверяет правильность имени файла и его наличие на диске. При открытии файла регистр DX должен содержать адрес необходимой ASCIIZ-строки, а регистр AL - код доступа:

    Ниже приведен пример открытия файла для чтения:

    MOV  AH,3DH       ; Запрос на открытие.
    MOV  AL,00        ; Только чтение.
    LEA  DX,PATHNM1   ; Строка в формате ASCIIZ.
    INT  21H          ; Вызов DOS-прерывания.
    JC   error4       ; Выход по ошибке.
    MOV  HANDLE2,AX   ; Сохранение файлового номера.

    Если файл с необходимым именем существует, то операция открытия устанавливает длину записи, равной 1, принимает существующий атрибут, сбрасывает флаг CF и заносит файловый номер в регистр AX.

    Если файл отсутствует, то операция устанавливает флаг CF и заносит в регистр AX код ошибки: 02, 04, 05 или 12.

    5. Чтение записей файла (функция 3FH). В регистре BX нужно установить файловый номер, в регистре CX - число читаемых байтов и в регистре DX - адрес области ввода. В следующем примере происходит считывание записи длиной 512 байт:

    HANDLE2    DW         ?
    INPREC     DB   512 DUP (' ')
         .     .     .     .
               MOV  AH,3FH      ; Запрос на чтение.
               MOV  BX,HANDLE2  ; Файловый номер.
               MOV  CX,512      ; Длина записи.
               LEA  DX,INPREC   ; Адрес области ввода.
               INT  21H         ; Вызов DOS-прерывания.
               JC   error5      ; Проверка на ошибку.
               CMP  AX,00       ; Прочитано 0 байтов?
               JE   endfile     ; Если "Да" - перейти на метку.

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

    На следующем шаге мы перечислим дополнительные операции над файлами.




Предыдущий шаг Содержание Следующий шаг