LRP1
.pdfрамма могла найти конец строки (такие строки называются строками
ASCIIZ).
Операции по пересылке данных из файла в файл требуют, чтобы была указана область памяти, в которую или из которой будут передаваться данные. Такой буфер определяется отведением ему места в памяти и установкой указателя на его первый (младший) байт.
3.2. Работа с каталогами.
Программа может создавать или удалять каталоги (подкаталоги) только при соблюдении некоторых условий. Для создания каталога необходимо, чтобы было по крайней мере одно пустое место в корневом каталоге, а при удалении каталога - чтобы он не содержал файлов или ссылок на другие каталоги. Кроме того нельзя удалить текущий каталог и корневой каталог.
3.2.1. Создание подкаталога.
Функция 39h прерывания 21h (в дальнейшем мы все функции прерывания 21h будем называть функциями DOS) создает подкаталог точно таким же образом, как это делает команда MKDIR операционной системы DOS. Перед вызовом этой функции необходимо сформировать ASCIIZ строку, содержащую имя накопителя (если необходимо) и путь к каталогу, в котором будет создаваться подкаталог. Например, для создания нового каталога N_DIR в каталоге S_DIR на накопителе A нужно указать строку "A:\S_DIR\N_DIR" , за которой должен следовать нулевой байт - признак конца строки. Адрес этой строки загружается в пару регистров DS:DX. Регистр AX содержит код возврата. Если AX=0 - каталог создан правильно, в противном случае произошла ошибка. Коды возможных ошибок (в 16-ричной системе) приведены в таблице 1.
Таблица 1
Код возврата функций DOS
─────────────────────────────────────────────────────────────
Код ошибки Значение
─────────────────────────────────────────────────────────────
1Неправильный номер функции
2Файл не найден
3Путь не найден
4Нет свободного идентификатора (номера) файла
5Отказ доступа
6Неверный идентификатор файла
7Нарушения в блоках управления памятью
─────────────────────────────────────────────────────────────
71
Продолжение табл.1
─────────────────────────────────────────────────────────────
Код ошибки Значение
─────────────────────────────────────────────────────────────
8Недостаточно памяти
9Неверный адрес области памяти A Неверная окружающая среда
B Неверный формат
C Неверный код доступа D Неверные данные
E Не используется
F Неверная спецификация дисковода
10Попытка удалить текущий дисковод
11Не то же самое устройство
12Больше файлов не найдено
──────────────────────────────────────────────────────────────────
3.2.2.Удаление подкаталога.
Для удаления подкаталога надо сформировать строку, полностью совпадающую с той, которая использовалась при создании каталога. Адрес строки занести в пару регистров DS:DX. Затем выполнить функцию 3Ah DOS. Коды ошибок возвращаются в регистре AX.
3.2.3. Установка текущего каталога.
Функция 3Bh DOS изменяет текущий каталог точно так же, как это делает команда CHDIR операционной системы DOS. Перед вызовом этой функции необходимо сформировать ASCIIZ строку, содержащую имя пути для нового текущего каталога, за которым следует нулевой байт - признак конца строки. Адрес этой строки загружается в пару регистров DS:DX. Коды ошибок возвращаются в регистре AX.
3.3. Создание и удаление файла.
Можно создать файл, не помещая в него никакой информации. В этом случае создается элемент каталога, а длина файла устанавливается равной 0. При удалении файла соответствующий элемент каталога на самом деле не удаляется, он просто становится не действующим за счет замены первого байта элемента (первого символа имени файла) на E5H. Впоследствии этот элемент может быть перезаписан при создании нового файла. Во время удаления файла вносятся также изменения в таблицу размещения файлов, с тем чтобы сектора, используемые этим файлом, были доступны для других файлов. Само содержимое сек-
72
торов при этом не стирается. Поэтому можно восстановить удаленный файл.
Файл может быть создан или уничтожен с помощью либо метода управляющего блока файла, либо метода дескриптора файла. Создание файла одним из перечисленных методов ни в коей мере не ограничивает будующий доступ к нему только этим методом. Но поскольку одновременно с созданием он открывается, то при создании необходимо использовать тот метод, с помощью которого вы будете работать с этим файлом. Когда файл создается, а затем закрывается и при этом в него ничего не записывается, ему соответствует элемент каталога с нулем в поле длины файла, однако дисковое пространство этому файлу не отводится.
3.3.1. Создание файла.
Функция 3CH DOS (прерывание 21Н) создает и открывает новый файл методом дискриптора файла. DS:DX должны указывать на ASCIIZ строку, представляющую путь к файлу и имя файла в стандартном формате MS-DOS, включая имя накопителя, если только файл не находится на накопителе, принятом по умолчанию. Строка должна завершаться байтом ASCII 0. Байт атрибутов файла необходимо поместить в регистр CX (0 - для обычного файля). Формат байта атрибутов приведен в таблице 2.
Таблица 2 Байт атрибутов файла
────────────────────────────────────────
Биты Значение, когда бит = 1
─────────────────────────────────────────
0Разрешено только чтение
1Скрытый
2Системный
3Метка тома
4Подкаталог
5Архив
6Не используется
7Не используется
──────────────────────────────────────────
Затем выполните функцию. При успешном выполнении флаг переноса CF (младший разряд регистра флагов Flags) будет равен нулю, а в AX будет возвращен номер (идентификатор) нового файла. При возникновании ошибки флаг переноса устанавливается в 1, а в AX содержит-
73
ся код ошибки (см. табл. 1).
Отметим, что если в каталоге уже существует файл с таким именем, то он "обрезается" до нулевой длины, и тем самым разрушается. Во избежание ошибок надо предварительно использовать функцию 4Н DOS для проверки.
3.3.2. Удаление файла.
Для уничтожения файла методом дескриптора файла используйте функцию 41Н DOS. И опять DS:DX должны указывать на строку, указывающую путь к файлу и его имя. " Джокеры" (символы "?" и "*") в имени файла не допускаются. Затем вызовите функцию. Если при возврате флаг переноса установлен, то функция не выполнена. В этом случае AX содержит код ошибки.
3.4. Открытие и закрытие файла.
Открыть файл - это значит создать небольшие блоки памяти, где будет содержаться информация о файле. При открытии файла каталог проверяется на наличие в нем файла. Если файл найден, то MS-DOS берет информацию из каталога о размере и дате создания файла. Затем при закрытии файла система обновляет информацию в каталоге. При закрытии файла также очищаются все системные буфера. При этом оставшиеся там данные отсылаются на диск. Если файл перед завершением программы не будет закрыт, то это может привести к потере данных.
3.4.1. Открытие файла.
Для открытия файлов используйте функцию 3DH DOS. Регистры DS: DX должны указывать на строку, представляющую путь к файлу. Вся строка должна быть не длиннее 63 байт и завершаться символом ASCII 0. В AL надо поместить код доступа:
0 - открывает файл для чтения;
1 - для записи;
2 - для чтения/записи.
При возврате AX будет содержать 16-битовый номер файла, по которому файл впоследствии идентифицируется. Файловый указатель устанавливается на начало файла. Размер записи устанавливается равным 1 байту - это связано с тем, что операции прямого доступа при использовании метода дискриптора файла не имеют специальных буферов (на самом деле файлы с прямым доступом рассматриваются как последовательные и с ними работают одни и те же функции). Эта функция позволяет открывать как обычные, так и спрятанные файлы. При возврате флаг переноса равен 0, если файл открыт успешно. В
74
противном случае флаг переноса устанавливается, а AX содержит код ошибки.
3.4.2. Закрытие файла.
Функция 3H DOS закрывает файл, открытый методом дескриптора файла. Надо поместить номер файла в регистр BX и выполнить функцию. При возврате флаг переноса равен 0, если все в порядке, иначе AX содержит код ошибки.
3.5. Чтение и запись файла.
Имеются два основных метода доступа к файлам - последовательный и прямой. Хотя в литературе часто используют термины "последовательный файл" и "файл прямого доступа", сами по себе файлы хранятся на диске одинаково: как непрерывная последовательность байтов. Ни в каталоге, ни к каком-либо другом месте нет индикатора, указывающего, что данный файл является последовательным или файлом прямого доступа.
Последовательные файлы помещают элементы данных один за другим, независимо от их длины, разделяя эти элементы парой символов: сначала возвратом каретки (ASCII 13), а затем переводом строки (ASCII 10). В последовательных файлах могут храниться как числа, так и строки. Строки требуют по одному байту на каждый символ строки. Числа по соглашению записываются в строковом виде, хотя есть возможность их записи и в числовом виде. Важно, чтобы программа понимала используемый формат.
Поскольку элементы данных последовательного файла имеют переменную длину, то невозможно узнать, где в файле расположен определенный элемент. Поэтому для того, чтобы найти нужный элемент, программа должна читать файл, начиная с начала и отсчитывая нужное число пар "возврат каретки/перевод строки". По этой причине файлы такого формата называют последовательными.
Файлы прямого доступа заранее отводят фиксированное место под каждый элемент данных. Если какой-либо элемент данных не занимает все отведенное пространство, то остаток заполняется пробелами.
Отметим, что описываемые ниже функции записи в файл и чтения из файла одинако пригодны для работы как с последовательными файлами, так и с файлами прямого доступа.
3.5.1. Запись файла.
3.5.1.1. Полная перезапись файла (формирование нового файла). Если файл был открыт с помощью функции 3CH, файловый указа-
75
тель устанавливается равным 0, |
поэтому |
отпадает необходимость в |
|
его дополнительной установке. |
Поместите номер файла в BX, |
а число |
|
записываемых байтов в CX. Установите DS:DX на первый байт |
выводи- |
||
мых данных и выполнте функцию |
40H DOS. |
При возврате, если все в |
|
порядке, флаг переноса равен 0 и AX содержит число реально записанных байтов, в противном случае AX содержит код ошибки.
3.5.1.2.Добавление записей в файл.
Для добавления записей в последовательный файл необходимо открыть файл с помощью функции 3DH DOS, помещая в AL 1, если программа будет только писать данные, и 2, если программа будет и читать и писать. Файловый указатель должен быть установлен на конец файла, иначе существующие данные будут переписаны (см. п.
2.6).
3.5.2. Чтение файла.
Для чтения данных из файла используется функция 3FH DOS. Файл должен быть открыт функцией 3DH DOS с кодом 0 в AL, если он открывается только для чтения, и с кодом 2, если он открывается и для чтения и для записи. При открытии файловый указатель автоматически устанавливается на первый байт файла. В BX должен быть помещен номер файла, а в CX - требуемое число байтов. При возврате AX будет содержать число реально прочитанных байтов. Если AX равно 0, то достигнут конец файла. При ошибке устанавливается флаг переноса, а AX содержит код ошибки.
3.6. Установка файлового указателя.
Функция 42H DOS используется для изменения позиции файлового указателя. В регистр BX помещается номер файла. Новое положение файлового указателя задается путем загрузки в регистр AL исходного положения указателя, а в пару регистров CX:DX - числа байтов, на которое необходимо переместить указатель. Загружаемое в CX:DX смещение в байтах - это 32-битовое целое число без знака. В регистре CX находится старшая часть смещения (равная 0, если смещение не превышает 65535), а в регистре DX - его младшая часть.
Исходное положение указателя задается значением в AL:
0 - смещение берется относительно начала файла и указатель сдвигается на CX:DX байтов от этой точки;
1 - смещение берется от текущей позиции в файле; 2 - смещение берется от текущего конца файла.
В последнем случае смещение в CX:DX обычно берется равным 0, чтобы определить текущий размер файла.
76
После завершения выполнения функции в паре регистров DX:AX содержится смещение текущего положения файлового указателя относительно начала файла. Если флаг переноса устанавливается в 1, то регистр AX содержит код ошибки.
4.Порядок выполнения
4.1.Создать массив данных MD размером примерно 15 - 30 эле-
ментов.
4.2.Создать каталог.
4.3.Создать файл в этом каталоге.
4.4.Переписать данные из массива данных MD в созданный файл.
4.5.Закрыть файл.
4.6. Открыть файл для чтения.
4.7.Переместить файловый указатель относительно начала файла на величину (в байтах), равную номеру студента в журнале.
4.8.Прочитать из файла 4 символа.
4.9.Закрыть файл.
4.10.При выполнении каждого из пунктов задания 4.2-4.9 после вызова соответствующей функции DOS обязательно проверять правильность ее выполнения.
5.Особенности программирования
5.1.На языке Турбо-Паскаль.
5.1.1.При использовании программного прерывания необходимо:
-подключить модуль Dos, в котором описаны процедуры Intr, MsDos и тип переменной Registers;
-объявить переменную этого типа, например, reg:Registers;
-к регистрам микропроцессора обращаться, как reg.ah, reg.flags и т.д.;
-функции DOS вызывать следующим образом (номер функции ука-
зывается в регистре reg.ah): MsDos(reg).
5.1.2. Значения исходного массива данных можно задать в виде типизированной константы:
const
md:array[1..25] of byte=(7, 111, ... , 32);
5.1.3. Строка ASCIIZ, с помощью которой указываются пути ка77
талога и файла в функциях 39H, 3AH, 3bH, 3CH, 3DH, 41H и др., может быть задана, например, так:
s:='A:\S_DIR\N_DIR'#0, где s:string;
Поскольку первый байт строки символов содержит длину строки, адрес имени пути следует задавать следующим образом:
reg.ds:=Seg(s);
reg.dx:=Ofs(s)+1:
Однако адрес исходного массива данных задается по-прежнему:
reg.ds:=Seg(md);
reg.dx:=Ofs(md);
5.2.На языке Турбо-Си.
5.2.1.При использовании программного прерывания необходимо: - подключить библиотеку Dos, в котором описаны процедура
Int86x и тип смеси REGS директивой:
#include <dos.h>
- объявить переменные смеси:
union REGS in,out,sr;
- к регистрам микропроцессора обращаться, как in.h.ah, in.x.ax;
-к сегментным регистрам обращаться, как sr.es;
-процедуру прерывания 13H вызывать следующим образом:
Int86x(0x13,&in,&out,&sr).
5.2.2. Значения исходного массива данных можно задать в виде:
char md[]={7, 111, ... , 32};
5.1.2. Строка ASCIIZ, с помощью которой указываются пути каталога и файла в функциях 39H, 3AH, 3BH, 3CH, 3DH, 41H и др., может быть задана так:
78
char *path={"A:\\S_DIR\\N_DIR"};
аадрес имени пути задается следующим образом:
sr.ds=FP_SEG(path); in.x.dx=FP_OFF(path);
6. Индивидуальные задания
Индивидуальные задания в данной лабораторной работе определены в п. 4.
7.Содержание отчета
7.1.Тема лабораторной работы. 7.2.Цель работы.
7.3.Порядок выполнения. 7.4.Индивидуальное задание. 7.5.Текст программы. 7.6.Результаты работы программы. 7.7.Выводы.
Литература
1.Фролов А.В., Фролов Г.В. Аппаратное обеспечение IBM PC: В 2-
хч. Ч. 1.-М.:"ДИАЛОГ-МИФИ", 1992.-208 с.- (Библиотека системного программиста; Т.2).
2.Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ./Предисл. Н. В. Гайского.- М.:Финансы и статистика, 1992.-544 с.: ил.
3.Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS: Пер. с англ.-М.: Радио и связь, 1992.-416 с.: ил.
4.Нортон П. Программно-аппаратная организация IBM PC: Пер. с англ.-М.: Радио и связь, 1991.-328 с.: ил.
5.Морс С.П., Алберт Д.Д. Архитектура микропроцессора 80286: Пер. с англ.-М.: Радио и связь, 1990.-304 с.: ил.
79
Учебное издание МЕТОДИЧЕСКИЕ УКАЗАНИЯ
К ЛАБОРАТОРНЫМ РАБОТАМ N1-N9
ПО КУРСУ "АРХИТЕКТУРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ" для студентов специальностей 22.01, 22.04 и 19.05
дневной вечерней и заочной форм обучения
Составители |
Анатолий Иванович Поворознюк |
|
Игорь Семенович Зыков |
|
Сергей Юрьевич Леонов |
Отв.за выпуск Ф.А.Домнин Редактор Технический редактор Корректор
План 1993, поз. |
|
|
|
|
Подп.к печ. |
.Формат 60Х841/16 |
. Бумага тип. N |
||
Печать офсетная. |
Усл.печ.л. .Усл.-кр.-отт. |
.Уч.-изд.N . |
||
Изд.N |
.Тираж |
300 экз.Зак.N |
.Бесплатно. |
|
_________________________________________________________________
Х П И. 310002, Харьков, ул. Фрунзе, 21.
_________________________________________________________________
Харьковское Межвузовское арендное полиграфическое предприятие 310093, Харьков, ул. Свердлова, 115.
