Чтение из файла
Факультет информационных технологий и робототехники (ФИТР)
Кафедра программного обеспечения вычислительной техники
и автоматизированных систем
Отчет по лабораторной работе № 7
по дисциплине: ”Языки программирования”
(Assembler)
на тему «Работа с файлами»
Выполнили: студенты группы Кухта В.Е.
107311 Коршун А.О
Федоров П.В.
Приняла: А.А. Несенчук
Минск 2012
Цель работы: изучение принципа работы с файлами на языке Assembler.
Краткие сведения из теории
Открытие файла
Файл открывает функция 0x3D. Указатель на имя файла передается через пару регистров DS:DX (DS — сегмент, a DX — смещение). В регистр AL нужно записать требуемый режим доступа. В большинстве случаев файл открывается для чтения и записи (AL=0). Функция возвращает в АХ дескриптор открытого файла или код ошибки. При ошибочном завершении функция устанавливает флаг переноса CF=1, при корректном завершении CF=0.
Ввод;.
Открытие файла
АН = 0x3D
DS:DX = указатель на имя файла,
завершенное нулевым байтом 0x0
AL. = режим доступа:
AL = 0 чтение и запись
AL = 1 только запись
AL = 2 только чтение
Вывод:
CF = 0 если успешно, тогда
АХ = дескриптор, назначенный файлу
Или
CF= 1 ошибка, тогда
АХ = код ошибки:
АХ = 0x0002 — файл не найден
АХ = 0x0003 — путь не найден
153 Ассемблер на примерах. Базовый курс
Закрытие файла
Прежде чем переходить к другим функциям, познакомимся с функцией закрытия файла ОхЗЕ:
Ввод:
Закрытие файла
АН = ОхЗЕ
ВХ = дескриптор файла
Вывод:
CF = 0 если успешно
Или
CF = 1 ошибка, тогда
АХ = код ошибки
Чтобы закрыть файл, поместите его дескриптор, присвоенный файлу при открытии, в регистр ВХ.
Чтение из файла
Данные могут читаться из файла блоками произвольного размера. Следующий системный вызов считывает следующий блок (внутренний указатель позиции файла увеличивается после операции чтения), то есть для чтения всего файла нам нужен цикл.
Ввод:
Чтение из файла:
АН = 0X3F
ВХ = дескриптор файла
DS:DX = указатель на буфер для хранения прочитанных данных
СХ = размер буфера
Вывод:
В случае успеха:
CF = 0
АХ= фактическое количество байтов, считанных из файла (ноль означает конец файла, EOF)
В случае ошибки:
CF=1
АХ= код ошибки
Функции нужно передать дескриптор файла в регистре ВХ. Указатель на буфер, в который нужно поместить прочитанный блок данных, передается через пару DS:DX. Через регистр СХ передается максимальное количество байтов, которое должно быть считано за раз: большую часть времени оно равно длине буфера. В регистр АХ функция записывает количество фактически прочитанных байтов (ведь если в файле осталось меньше данных, чем мы хотим прочитать, значение в АХ будет меньше размера буфера).
В случае ошибки устанавливается флаг переноса CF=1, а в АХ будет код ошибки.
Данные, прочитанные из файла, могут быть выведены на экран с помощью функции DOS 0x09. Но тогда у нас будут проблемы с любым файлом, содержащим символ $, который обозначает конец строки для функции 0x09. Чтобы обойти эту проблему, мы не будем использовать функцию 0x09, а вместо вывода на экран будем записывать прочитанные данные в поток стандартного вывода, а для вывода на экран используем функцию перенаправления ввода/вывода, предоставленную нам операционной системой. Дескриптор файла стандартного вывода равен 0x0001.