На этом шаге мы рассмотрим основные операции над файлами.
Перечислим основные операции, организующие работу с файлами в расширенной версии 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 (ошибка файлового номера).
На следующем шаге мы перечислим дополнительные операции над файлами.