CF = 0 и АХ = идентификатор файла, открытого для чтения/записи в режиме совместимости, если не произошла ошибка.
CF = 1 и АХ = код ошибки (03h — путь не найден, 04h — слишком много открытых файлов, 05h — доступ запрещен, 50h — файл уже существует).
Ввод:
АН = 3Fh
ВХ = идентификатор файла
СХ = число байт
DS:DX = адрес буфера для приема данных
Вывод:
CF = 0 и АХ = число считанных байт, если не произошла ошибка
CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный идентификатор
Если при чтении из файла число фактически считанных байт в АХ меньше, чем заказанное число в СХ, то при чтении был достигнут конец файла. Каждая следующая операция чтения, так же как и записи, начинается не с начала файла, а с того байта, на котором остановилась предыдущая операция чтения/записи. Если требуется считать (или записать) произвольный участок файла, используют функцию 42h (функция lseek в С).
При работе с файлами на ассемблере единичной записью является байт. Все записи имеют номера от 0 до L-1, где L длина файла. При открытии файла указатель устанавливается на запись 0. При чтении или записи указатель автоматически передвигается на n байт (где n - число прочитанных или записанных байт).
При чтении файла (функция 3FH) в АХ помещается считанное количество байт. Поэтому следует каждый раз сравнивать АХ и СХ. Если АХ>СХ, то обычно это означает, что в процессе чтения произошел переход через конец файла (устанавливается флаг СF). При записи в файл ситуация аналогична, но в этом случае неравенство содержимого АХ и СХ будет означать, что в процессе записи произошла ошибка.
5) Переместить указатель чтения/записи
Функция DOS 42h — Переместить указатель чтения/записи
Ввод:
АН = 42h
ВХ = идентификатор
CX:DX = расстояние, на которое надо переместить указатель (со знаком) (4 ГБ)
AL = перемещение от:
Вывод:
CF = 0 и CX:DX = новое значение указателя (в байтах от начала файла), если не произошла ошибка
CF = 1 и АХ = 06h, если неправильный идентификатор
Указатель можно установить за реальными пределами файла: если указатель устанавливается в отрицательное число, следующая операция чтения/записи вызовет ошибку; если указатель устанавливается в положительное число, большее длины файла, следующая операция записи увеличит размер файла. Эта функция также часто используется для определения длины файла. Для этого необходимо вызвать ее с параметрами СХ = 0, DX = 0, AL = 2, и в CX:DX будет возвращена длина файла в байтах.
Используя функцию 42Н, можно переместиться к любому байту файла. Ниже дается полное описание этой функции.
АН 42Н
ВХ описатель файла
CX:DX на сколько передвинуть
AL как передвигать
0 начало файла + CX:DX,
1 от текущей позиции файла + CX:DX,
2 от конца файла + СХ:DX
Если флаг переноса установлен, то в АХ помещен код ошибки, в противном случае AX:DX показывает новую позицию в файле.