Функция DOS 3Fh — Чтение из файла или устройства
Ввод: | АН = 3Fh ВХ = идентификатор СХ = число байт DS:DX = адрес буфера для приема данных |
Вывод: | CF = 0 и АХ = число считанных байт, если не произошла ошибка CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный идентификатор |
Если при чтении из файла число фактически считанных байт в АХ меньше, чем заказанное число в СХ, при чтении был достигнут конец файла. Каждая следующая операция чтения, так же как и записи, начинается не с начала файла, а с того байта, на котором остановилась предыдущая операция чтения/записи. Если требуется считать (или записать) произвольный участок файла, используют функцию 42h (функция lseek в С).
Функция DOS 42h — Переместить указатель чтения/записи
Ввод: | АН = 42h ВХ = идентификатор CX:DX = расстояние, на которое надо переместить указатель (со знаком) AL = перемещение от:
1 — от текущей позиции 2 — от конца файла |
Вывод: | CF = 0 и CX:DX = новое значение указателя (в байтах от начала файла), если не произошла ошибка CF = 1 и АХ = 06h, если неправильный идентификатор |
Указатель можно установить за реальными пределами файла: если указатель устанавливается в отрицательное число, следующая операция чтения/записи вызовет ошибку; если указатель устанавливается в положительное число, большее длины файла, следующая операция записи увеличит размер файла. Эта функция также часто используется для определения длины файла — достаточно вызвать ее с СХ = 0, DX = 0, AL = 2, и в CX:DX будет возвращена длина файла в байтах.
Функция DOS 40h — Запись в файл или устройство
Ввод: | АН = 40h ВХ = идентификатор СХ = число байт DS:DX = адрес буфера с данными |
Вывод: | CF = 0 и АХ = число записанных байт, если не произошла ошибка CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный идентификатор |
Если при записи в файл указать СХ = 0, файл будет обрезан по текущему значению указателя. При записи в файл на самом деле происходит запись в буфер DOS, данные из которого сбрасываются на диск при закрытии файла или если их количество превышает размер сектора диска. Для немедленного сброса буфера можно использовать функцию 68h (функция fflush в С).
Ввод: | АН = 68h ВХ = идентификатор |
Вывод: | CF = 0, если операция выполнена CF = 1, если произошла ошибка (АХ = код ошибки) |
Ввод: | АН = 0Dh |
Вывод: | никакого |