Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ОС.doc
Скачиваний:
3
Добавлен:
22.11.2019
Размер:
205.31 Кб
Скачать

2. Лабораторная работа №1. Реализация низкоуровневых функций работы с файлами

Цель работы: изучение принципов разработки низкоуровневых функций с использованием файлового системного сервиса операционной системы MS-DOS. Изучение метода реализации модуля на языке высокого уровня Турбо Паскаль, его синтаксиса.

Задание: разработать низкоуровневые функции ввода-вывода с использованием возможностей предоставляемых файловым системным сервисом ОС MS-DOS на языке высокого уровня Турбо Паскаль. Законченные функции оформить в виде модуля.

Общие теоретические сведения

Операционная система MS-DOS предоставляет возможность программисту выполнять необходимые операции с файлами используя библиотеку файловых функций.

Для работы с файлами операционная система предоставляет следующие возможности:

  1. создание файла (функция 3cH);

  2. открытие файла (функция 3dH);

  3. закрытие файла (функция 3eH);

  4. чтение данных из файла (функция 3fH);

  5. запись данных в файл (функция 40H);

  6. удаление файла (функция 41H);

  7. установка указателя на любую позицию в файле (функция 42H).

Доступ к регистрам процессора на языке Турбо Паскаль осуществляется посредством переменной типа registers. Данный тип описан в модуле DOS языка Турбо Паскаль.

Таким образом, для того чтобы обратиться к любому из регистров используется связка из переменной типа registers и названия соответствующего регистра.

Пример:

Program simple1;

Uses dos; {подключение модуля DOS}

Var R:registers; {переменная R является переменной типа registers}

Begin

R.AX:=10; {запись значения 10 в регистр AX}

………….

End.

После занесения всех значений в соответствующие поля переменной типа registers необходимо вызвать операционную систему для выполнения указанного посредством номера функции действия и анализа содержимого других регистров. Вызов операционной системы осуществляется с помощью процедуры MSDOS модуля DOS языка Т.Паскаль. В качестве параметра в процедуру необходимо передать переменную типа registers в соответствующие поля которой занесены нужные значения.

Пример вызова операционной системы:

Var R:registers;

begin

R.ah:=$3E;

. . . . . . . . .

MsDos(R);

end;

Рассмотрим более подробно эти функции.

Функция 3cH: Создать файл через описатель

Для реализации данной функции в качестве входных параметров ОС MS-DOS должна получить:

  • В регистр AH значение 3cH обозначающее номер функции.

  • В регистровой паре DS:DX адрес строки ASCIIZ с именем создаваемого файла.

  • В регистр CX атрибуты создаваемого файла.

Результат выполнения данной функции можно проверить по параметрам, переданным ОС в программу. Если флаг CF во флаговом регистре установлен (равен 1), то произошла ошибка. Регистр AX в этом случае содержит код ошибки. Список возможных ошибок приведён в приложении. Полный список всех ошибок можно посмотреть в программе Tech help. Если же флаг CF не установлен (равен 0), то функция завершилась без ошибок и регистр AX содержит описатель (handle) файла.

Описание:

DS:DX указывает на строку ASCIIZ в форме: "диск:\путь\имя_файла". Строка в формате ASCIIZ, в отличие от строки ASCII, должна завершаться символом, код которого равен 0. Регистр DS должен содержать сегмент строки с именем файла, а DX смешение этой строки относительно начала сегмента. Для получения сегмента и смещения переменной в языке Турбо Паскаль предусмотрены функции Seg и Ofs. Если диск и/или путь опущены, они принимаются по умолчанию. Файл создается в указанном (или умалчиваемом) каталоге и открывается в режиме доступа чтение/запись. Программист должен сохранить описатель (handle) для последующих операций с созданным файлом.

Если файл уже существует:

• при открытии файл усекается до нулевой длины;

• если атрибут файла - только чтение, открытие отвергается;

• CONFIG.SYS специфицирует число доступных описателей в системе.

Атрибут файла - это один байт битовых флагов, ассоциированный с каждым файлом и хранящийся в элементе оглавления. Наиболее часто применяемым значением в качестве атрибутов файла является 0- обычный файл. Атрибут представляет собой переменную типа byte полученную следующим образом:

Функция 3dH: Открыть описатель файла

Входные параметры:

  • Регистр AH должен содержать значение 3dH;

  • Регистровая пара DS:DX адрес строки ASCIIZ с именем файла;

  • Регистр AL должен содержать значение режима открытия из следующих констант:

  1. AL=0 чтобы открыть файл для чтения;

  2. AL=1 чтобы открыть файл для записи;

  3. AL=2 чтобы открыть файл для чтения и записи.

Выходные параметры:

  • Регистр AX - код ошибки, если флаг CF установлен или описатель файла, если ошибок не было.

Описание:

Файл, для которого вызывается данная функция, должен существовать. Указатель при успешном завершении функции устанавливается в нулевую позицию. Программист должен сохранить описатель для последующих операций с файлом.

Функция 3eH: Закрыть описатель файла

Входные параметры:

  • Регистр AH должен содержать значение 3eH.

  • Регистр BX должен содержать описатель (handle) закрываемого файла.

Выходные параметры:

  • В случае ошибки (если установлен флаг CF) функция возвращает в регистр AX код ошибки.

Функция 3fH: Читать файл через описатель

Входные параметры:

  • Регистр AH - значение 3fH;

  • Регистр BX-описатель файла;

  • Регистровая пара DS:DX - адрес буфера для чтения данных;

  • Регистр CX - число считываемых байтов.

Выходные параметры:

  • Регистр AX-код ошибки, если флаг CF установлен или число действительно прочитанных байтов (если флаг CF не установлен).

Описание:

CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Указатель чтения/записи в файле в результате выполнения этой операции перемешается на прочитанное количество байт.

Программист должен всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

  1. если AX=CX, (CF=0) - чтение было без ошибок;

  2. если AX=0, достигнут конец файла (EOF);

  3. если AX<CX (AX0):

  • входная строка имеет длину AX байт;

  • в процессе чтения достигнут EOF.

Функция 40H: Писать в файл через описатель

Входные параметры:

  • Регистр AH - 40H;

  • Регистр BX - описатель файла;

  • Регистровая пара DS:DX - адрес буфера, содержащего записываемые данные;

  • Регистр CX - число записываемых байт.

Выходные параметры:

  • Регистр AX - код ошибки, если флаг CF установлен или число реально записанных данных (если флаг CF не установлен).

Описание:

CX байт данных записывается в файл с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX, и записываются, начиная с текущей позиции указателя чтения/записи файла. Функция меняет положение указателя чтения/записи, перемещая его на количество реально записанных байтов в файл. Как и в случае функции чтения данных, программист должен всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи):

  1. если AX=CX, запись была успешной;

  2. если AX<CX, встретилась ошибка (скорее всего, переполнение).

Функция 41H: Удалить файл

Входные параметры:

  • Регистр AH - 41H;

  • Регистровая пара DS:DX - адрес строки ASCIIZ с именем удаляемого файла.

Выходные параметры:

  • Регистр AX - код ошибки, если флаг CF установлен.

Описание:

DS:DX указывает на строку ASCIIZ в форме: "диск:\путь\имяфайла". Если диск и/или путь опущены, они принимаются по умолчанию. Имя файла не может содержать обобщенные символы ('?' и '*'). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H CHMOD.

Функция 42H: Установить указатель на любую позицию в файле

Входные параметры:

  • Регистр AH - 42H;

  • Регистр BX - описатель файла;

  • Регистровая пара CX:DX - на сколько передвинуть указатель: (CX*65536)+DX;

  • Регистр AL содержит одну из следующих констант:

  1. 0 переместить к началу файла+CX:DX;

  2. 1 переместить к текущей позиции+CX:DX;

  3. 2 переместить к концу файла+CX:DX.

Выходные параметры:

  • Регистр AX - код ошибки, если CF установлен.

  • Регистровая пара DX:AX - новая позиция указателя в файле (если нет ошибки).

Описание:

Перемещает логический указатель чтения/записи к нужной позиции в файле. Очередная операция чтения или записи начнется с этого адреса. Вызов этой функции с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. Действительная длина файла равна (DX*65536)+AX.