- •1. Подготовка к выполнению лабораторных работ Цели и задачи лабораторного практикума
- •Программа и порядок выполнения лабораторных работ
- •Требования к оформлению отчёта о выполнении лабораторной работы
- •Общие теоретические сведения Файловый сервис операционной системы ms-dos
- •Системные регистры процессора
- •2. Лабораторная работа №1. Реализация низкоуровневых функций работы с файлами
- •Общие теоретические сведения
- •Контрольные вопросы к лабораторной работе
- •3. Лабораторная работа №2. Применение дескрипторно-ориентированных файловых функций
- •Общие теоретические сведения
- •Контрольные вопросы к лабораторной работе
- •4. Лабораторная работа №3. Реализация низкоуровневых функций работы с каталогами
- •Общие теоретические сведения
- •Контрольные вопросы к лабораторной работе
- •5. Лабораторная работа №4. Реализация низкоуровневых функций работы с памятью
- •Общие теоретические сведения
- •Контрольные вопросы к лабораторной работе
- •6. Лабораторная работа №5. Реализация низкоуровневых функций работы с системной датой и временем
- •Общие теоретические сведения
- •Контрольные вопросы к лабораторной работе
- •7. Лабораторная работа №6. Прерывания в ос ms-dos. Обработчики аппаратных прерываний. Механизм обработки прерываний
- •Общие теоретические сведения
- •Контрольные вопросы к лабораторной работе
- •Приложение №1. Коды ошибок для операций работы с файлами
2. Лабораторная работа №1. Реализация низкоуровневых функций работы с файлами
Цель работы: изучение принципов разработки низкоуровневых функций с использованием файлового системного сервиса операционной системы MS-DOS. Изучение метода реализации модуля на языке высокого уровня Турбо Паскаль, его синтаксиса.
Задание: разработать низкоуровневые функции ввода-вывода с использованием возможностей предоставляемых файловым системным сервисом ОС MS-DOS на языке высокого уровня Турбо Паскаль. Законченные функции оформить в виде модуля.
Общие теоретические сведения
Операционная система MS-DOS предоставляет возможность программисту выполнять необходимые операции с файлами используя библиотеку файловых функций.
Для работы с файлами операционная система предоставляет следующие возможности:
создание файла (функция 3cH);
открытие файла (функция 3dH);
закрытие файла (функция 3eH);
чтение данных из файла (функция 3fH);
запись данных в файл (функция 40H);
удаление файла (функция 41H);
установка указателя на любую позицию в файле (функция 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 должен содержать значение режима открытия из следующих констант:
AL=0 чтобы открыть файл для чтения;
AL=1 чтобы открыть файл для записи;
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 (запрошенное число байт):
если AX=CX, (CF=0) - чтение было без ошибок;
если AX=0, достигнут конец файла (EOF);
если AX<CX (AX0):
входная строка имеет длину AX байт;
в процессе чтения достигнут EOF.
Функция 40H: Писать в файл через описатель
Входные параметры:
Регистр AH - 40H;
Регистр BX - описатель файла;
Регистровая пара DS:DX - адрес буфера, содержащего записываемые данные;
Регистр CX - число записываемых байт.
Выходные параметры:
Регистр AX - код ошибки, если флаг CF установлен или число реально записанных данных (если флаг CF не установлен).
Описание:
CX байт данных записывается в файл с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX, и записываются, начиная с текущей позиции указателя чтения/записи файла. Функция меняет положение указателя чтения/записи, перемещая его на количество реально записанных байтов в файл. Как и в случае функции чтения данных, программист должен всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи):
если AX=CX, запись была успешной;
если 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 содержит одну из следующих констант:
0 переместить к началу файла+CX:DX;
1 переместить к текущей позиции+CX:DX;
2 переместить к концу файла+CX:DX.
Выходные параметры:
Регистр AX - код ошибки, если CF установлен.
Регистровая пара DX:AX - новая позиция указателя в файле (если нет ошибки).
Описание:
Перемещает логический указатель чтения/записи к нужной позиции в файле. Очередная операция чтения или записи начнется с этого адреса. Вызов этой функции с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. Действительная длина файла равна (DX*65536)+AX.