Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория. Архитектура компьютеров.doc
Скачиваний:
3
Добавлен:
28.10.2018
Размер:
479.74 Кб
Скачать

4. Порядок выполнения

4.1. С помощью функции 2 прерывания 13h прочитать в память со-

держимое первого сектора таблицы размещения файлов (адрес FAT был

определен в лаб. раб. "Структура дисков").

4.2. Проверить правильность выполненной операции.

4.3. Используя номера начальных кластеров файлов, полученных в

лаб. раб. "Структура корневого каталога", по таблице размещения

файлов построить полные цепочки кластеров для этих файлов.

5.Особенности программирования.

5.1. На языке Турбо-Паскаль.

5.1.1. При использовании программного прерывания необходимо:

- подключить модуль Dos, в котором описаны процедура Intr и

тип переменной Registers;

- объявить переменную этого типа, например, reg:Registers; -

к регистрам микропроцессора обращаться, как reg.ah, reg.al и т.д.;

- процедуру прерывания 13H вызывать следующим образом:

Intr($13,reg).

5.1.2. Область памяти, куда считывается содержимое сектора,

удобно объявить как массив байтов:

var

fat:array[0..511] of byte;

Необходимые значения сегмента и смещения адреса области памя-

ти можно задать, используя функции Seg и Ofs:

reg.es:=Seg(sect);

reg.bx:=Ofs(sect);

5.1.3. Определение номера следующего кластера с учетом приве-

денного в п. 3.3 алгоритма можно реализовать с помощью функции:

function n_clast(w:word):word;

var i:word;

begin

i:=w*3 div 2;

if (w mod 2)=0 then

n_clast:=((fat[i+1])*256+(fat[i]) and $0fff

else

n_clast:= ((fat[i+1]*256+fat[i]) shr 4

end;

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. Область памяти, куда считывается содержимое сектора,

удобно объявить как массив байтов:

unsigned char buf[512];

Тогда необходимые значения сегмента и смещения адреса области

памяти можно задать, используя функции FP_SEG() и FP_OFF():

sr.es=FP_SEG(buf);

in.x.bx=FP_OFF(buf);

5.2.3. Определение номера следующего кластера с учетом приве-

денного в п. 3.3 алгоритма можно реализовать с помощью фрагмента

программы:

nom_kl=2;

while(nom_kl<0xff8) /*цикл чтение кластеров из FAT*/

{

printf("\nкластер= %d ",nom_kl);

rn=nom_kl; /*копирование номера кластера*/

rn=rn>>1; /*сдвиг вправо или деление на 2 */

beg=nom_kl+rn; /*смещение в FAT 1.5n*/

rn=rn<<1; /*сдвиг влево или умножение на 2 */

b[0]=buf[beg]; /*чтение 1 байта FAT*/

b[1]=buf[++beg]; /*чтение 2 байта FAT*/

if(nom_kl==rn)/*номер кластеро четное*/

{

b[1]=b[1]&0x0f; /*выделение младших 12 бит*/

bb=(unsigned int *)b;/*преврашение 2-х байт в int */

nom_kl=*bb;

}

else

{

b[0]=b[0]&0xf0; /*выделение старших 12 бит*/

bb=(unsigned int *)b;/*преврашение 2-х байт в int */

nom_kl=*bb;

nom_kl=nom_kl>>4;

}

6. Индивидуальные задания

Индивидуальные задания в данной лабораторной работе определе-

ны в п. 4.

7. Содержание отчета

7.1.Тема лабораторной работы.

7.2.Цель работы.

7.3.Индивидуальное задание.

7.4.Текст программы.

7.5.Результаты работы программы.

Лабораторная работа 9 РАБОТА С ФАЙЛАМИ

1. Цель работы

Приобретение практических навыков работы с файлами - созда-

ние, изменение и удаление каталогов, создание и удаление файлов,

открытие файлов, запись и чтение файлов, закрытие файлов.

2. Темы для предварительной проработки

2.1. Структура каталогов и файлов.Манипуляции с файлом.

3. Описание работы

3.1. Методы и особенности доступа к файлам.

MS-DOS использует два метода доступа к файлам: метод управля-

ющего блока файла (FCB) и метод дескриптора файла. Метод FCB су-

ществует с тех пор, когда MS-DOS еще не работала с древовидной

структурой каталогов, поэтому с его помощью можно получить доступ

только к файлам, находящимся в текущем катологе. Метод дескриптора

файла позволяет получить доступ к любому файлу, независимо от то-

го, какой каталог является текущим.

Поскольку теперь древовидная структура каталогов широко ис-

пользуется, мы будем в своей работе применять именно этот метод.

MS-DOS продолжает поддерживать метод FCB главным образом для сов-

местимости со старым программным обеспечением.

Прежде чем читать или писать данные в файл, его нужно отк-

рыть. Открыть файл - значить создать и инициализировать специаль-

ную область данных, используемую MS-DOS, которая содержит важную

информацию о файле, такую, как имя файла, имя накопителя, размер

записи файла и др. При доступе к файлам с помощью дескриптора фай-

ла MS-DOS автоматически создает область данных для файла в произ-

вольном месте памяти. Затем MS-DOS создает уникальный для каждого

файла 16-битовый код (номер файла). Впоследствии этот номер ис-

пользуется функциями MS-DOS для идентификации того, с каким из от-

крытых файлов производятся операции. Все, что нужно для нахождения

файла, - это стандартная строка пути, в которой может быть необя-

зательное имя накопителя, а имена подкаталогов разделены обратной

косой чертой. Эти строки отличаются от стандартного запроса MS-DOS

только тем, что они должны завершаться байтом ASCII 0, чтобы прог-

рамма могла найти конец строки (такие строки называются строками

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 Нарушения в блоках управления памятью

───────────────────────────────────────────────

Продолжение табл.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. Впоследствии этот элемент может быть перезаписан при соз-

дании нового файла. Во время удаления файла вносятся также измене-

ния в таблицу размещения файлов, с тем чтобы сектора, используемые

этим файлом, были доступны для других файлов. Само содержимое сек-

торов при этом не стирается. Поэтому можно восстановить удаленный

файл.

Файл может быть создан или уничтожен с помощью либо метода

управляющего блока файла, либо метода дескриптора файла. Создание

файла одним из перечисленных методов ни в коей мере не ограничива-

ет будующий доступ к нему только этим методом. Но поскольку однов-

ременно с созданием он открывается, то при создании необходимо ис-

пользовать тот метод, с помощью которого вы будете работать с этим

файлом. Когда файл создается, а затем закрывается и при этом в не-

го ничего не записывается, ему соответствует элемент каталога с

нулем в поле длины файла, однако дисковое пространство этому файлу

не отводится.

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 содержит-

ся код ошибки (см. табл. 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, если файл открыт успешно. В

противном случае флаг переноса устанавливается, а AX содержит код

ошибки.

3.4.2. Закрытие файла.

Функция 3H DOS закрывает файл, открытый методом дескриптора

файла. Надо поместить номер файла в регистр BX и выполнить функ-

цию. При возврате флаг переноса равен 0, если все в порядке, иначе

AX содержит код ошибки.

3.5. Чтение и запись файла.

Имеются два основных метода доступа к файлам - последователь-

ный и прямой. Хотя в литературе часто используют термины "последо-

вательный файл" и "файл прямого доступа", сами по себе файлы хра-

нятся на диске одинаково: как непрерывная последовательность

байтов. Ни в каталоге, ни к каком-либо другом месте нет индикато-

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

файлом прямого доступа.

Последовательные файлы помещают элементы данных один за дру-

гим, независимо от их длины, разделяя эти элементы парой символов:

сначала возвратом каретки (ASCII 13), а затем переводом строки

(ASCII 10). В последовательных файлах могут храниться как числа,

так и строки. Строки требуют по одному байту на каждый символ

строки. Числа по соглашению записываются в строковом виде, хотя

есть возможность их записи и в числовом виде. Важно, чтобы прог-

рамма понимала используемый формат.

Поскольку элементы данных последовательного файла имеют пере-

менную длину, то невозможно узнать, где в файле расположен опреде-

ленный элемент. Поэтому для того, чтобы найти нужный элемент,

программа должна читать файл, начиная с начала и отсчитывая нужное

число пар "возврат каретки/перевод строки". По этой причине файлы

такого формата называют последовательными.

Файлы прямого доступа заранее отводят фиксированное место под

каждый элемент данных. Если какой-либо элемент данных не занимает

все отведенное пространство, то остаток заполняется пробелами.

Отметим, что описываемые ниже функции записи в файл и чтения

из файла одинако пригодны для работы как с последовательными фай-

лами, так и с файлами прямого доступа.

3.5.1. Запись файла.

3.5.1.1. Полная перезапись файла (формирование нового файла).

Если файл был открыт с помощью функции 3CH, файловый указа-

тель устанавливается равным 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,

чтобы определить текущий размер файла.

После завершения выполнения функции в паре регистров DX:AX

содержится смещение текущего положения файлового указателя относи-

тельно начала файла. Если флаг переноса устанавливается в 1, то

регистр AX содержит код ошибки.