Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LRP1

.pdf
Скачиваний:
14
Добавлен:
02.02.2015
Размер:
452.93 Кб
Скачать

4.4. Сравнить полученную информацию о файлах с информацией, предоставляемой программой Norton Commander.

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

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

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

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

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

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

ит.д.;

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

Intr($13,reg).

5.1.2. Область памяти, куда считывается содержимое сектора каталога удобно объявить как массив записей (см. табл. 1):

var

 

sec_cat:array[1..16] of record

 

name

:array[1..8] of char;

name_e

:array[1..3] of char;

atr

:byte;

rez

:array[1..10] of byte;

time,

 

date,

 

n_clast

:word;

size

:longint

end;

 

Необходимые значения сегмента и смещения адреса области памяти можно задать, используя функции Seg и Ofs:

reg.es:=Seg(sec_cat); reg.bx:=Ofs(sec_cat);

5.1.3. Для выделения полей времени и даты использовать выражения, приведенные на рис. 1 и рис. 2. Символу & в Паскале соответсвтвует операция AND, а символу >> - Shr (сдвиг вправо).

61

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. Область памяти, куда считывается содержимое сектора каталога удобно объявить как шаблон структуры(см. табл. 1):

struct sec_cat{

unsigned char name[8]; unsigned char name_e[3]; unsigned char atr; unsigned char rez[10]; unsigned int time; unsigned int date; unsigned int n_clast; unsigned long size ;

};

и определить массив структур

struct sec_cat sec[16];

Тогда необходимые значения сегмента и смещения адреса области памяти можно задать, используя функции FP_SEG() и FP_OFF():

sr.es=FP_SEG(sec[0].name[0]); in.x.bx=FP_OFF(sec[0].name[0]);

5.2.3. Для выделения полей времени и даты использовать выраже62

ния, приведенные на рис. 1 и рис. 2.

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

ны в п. 4.

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

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

7.3.Порядок выполнения. 7.4.Индивидуальное задание. 7.5.Текст программы. 7.6.Результаты работы программы. 7.7.Выводы.

Лабораторная работа 8

СТРУКТУРА ТАБЛИЦЫ РАЗМЕЩЕНИЯ ФАЙЛОВ FAT

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

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

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

2.1.Организация таблицы размещения файлов FAT.

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

3.1.Назначение FAT.

Диск использует таблицу размещения файлов (FAT) для отведения дискового пространства файлам и хранения информации о свободных секторах. Из соображений безопасности на всех дисках хранятся по две копии FAT. Они хранятся последовательно начиная с первого сектора FAT. Для дискеты первым сектором FAT будет сектор, следующий за корневым сектором, т.е. сектор с координатами: дорожка 0, сторона 0, сектор 2. Для жесткого диска первый сектор FAT определяется с помощью таблицы разделов и таблицы корневого сектора (см. лаб. раб. "Структура дисков"). Число секторов, занимаемых FAT, оп-

63

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

Таблица размещения файлов хранит информацию о каждом кластере файла на диске. Кластер - это группа смежных секторов. Величина кластера,которая для разных типов дисков и форматов может быть разной, указывается в таблице корневого сектора. Кластеры были введены с целью уменьшения размера FAT.

3.2. Организация FAT.

Каждая позиция в таблице размещения файлов соответствует определенной позиции кластера на диске. Обычно файл занимает несколько кластеров и запись в каталоге файлов содержит номер стартового кластера, в котором находится начало файла. Посмотрев позицию FAT, соответствующую первому кластеру, DOS находит номер кластера, в котором хранится следующая порция файла. Этому кластеру соответствует своя запись в FAT, которая в свою очередь содержит номер следующего кластера в цепочке. Для последнего кластера, занятого файлом, FAT содержит значения от FF8H до FFFH. Неиспользуемым (или освобожденным) кластерам соответствует значение 000, а дефектным секторам -FF7H. Наконец, значения от FF0H до FF7H приписываются резервным кластерам.

На рис. 1 приведены элемент корневого каталога, описывающего файл с именем MYFILE.TXT, и фрагмент таблицы размещения файлов, определяющей размещение этого файла на диске:

номер начального кластера ══╗ ╓───────────────────┬─┬───────────────────┬───┬───┬───┬───────╖ ║M Y F I L E T X T│a│ │ t │ d │08 │ длина ║ ╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╫─┴─┴─┴─┴─╜

╔═════════════════════════╝ 00 01 02 03 04 05 06 07 ║8 09 0a 0b 0c 0d 0e 0f ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌─┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐

00│ID││ff││03═ 04═ 05═ ff││00││00││09═ 0a═ 0b═ 15││00││00││00││00│

└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└╫─┘└──┘└──┘└──┘└──┘

╔═══════════════════════╝

┌──┐┌──┐┌──┐┌──┐┌──┐┌─┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐ 10 │00││00││00││00││00││16═ 17═ 19││f7││1a═ 1b═ ff││00││00││00││00│

╚═══════╝

Рис. 1

Этот рисунок иллюстрирует основные концепции FAT. Из него видно, что 2:

64

-Файл MYFILE.TXT занимает 10 кластеров. Первый кластер - это кластер 08, последний кластер - 1bH. Цепочка кластеров - 8, 9, 0a, 0b, 15, 16, 17, 19, 1a, 1b. Каждый элемент указывает на следующий элемент цепочки, а последний элемент содержит специальный код.

-Кластер 18H помечен как плохой и не входит в цепочку распределения.

-Кластеры 6,7, 0cH-14H и 1cH-1fH пусты и доступны для распределения.

-Еще одна цепочка начинается с кластера 2 и кончается кластером 5. Чтобы узнать имя файла, нужно отыскать элемент оглавления с начальным номером кластера 02.

Для всех гибких дисков размер ячейки таблицы размещения файлов равен 12 битов, что позволяет обращаться к 4096 кластерам. Что касается жестких дисков, то они могут использовать MS DOS как c 12битными FAT, так и с 16-битными FAT. Тип используемой FAT указан в таблице разделов.

3.3. Работа с FAT.

Рассмотрим особенности работы с 12-битной FAT.

Номер кластера содержит 3 шестнадцатиричные цифры, для хранения которых требуется 1 1/2 байта. Для уменьшения размеров FAT числа для двух соседних кластеров хранятся в трех последовательных байтах таблицы. MS-DOS автоматически производит все необходимые вычисления.

Первые три байта FAT не используются доля номеров кластеров. Первый байт содержит код, определяющий тип диска, а следующие два байта равны FFH. Поскольку эти позиции таблицы заняты, то кластеры нумеруются, начиная с 2, причем кластеры 2 и 3 занимают вторую тройку байтов таблицы.

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

-Умножить номер кластера на 3.

-Разделить результат на 2 с отбрасыванием дробной части.

-Прочитать 2 байта из FAT с полученным относительно начала FAT смещением.

-Если исходный номер кластера четный, то взять младшие 12 бит (т.е. наложить маску 0fffH), иначе взять старшие 12 бит (т.е. сдвинуть на 4 вправо).

3.4. Чтение сектора диска в память.

Для чтения содержимого требуемого сектора в указанную область памяти используется функция 2 прерывания 13h. При этом регистры

65

имеют следующее назначение:

ah - номер функции;

dl - номер дисковода: 0 - "A", 1 - "B", $80 - жесткий диск; dh - номер головки (стороны);

ch - номер дорожки (цилиндра); cl - номер сектора;

al - число секторов;

es - значение сегмента адреса области памяти; bx - значение смещения адреса области памяти.

Если функция прерывания выполнена без ошибок, то флаг переноса CF (младший разряд регистра флагов Flags) установлен в 0 и регистр ah содержит 0. Если флаг переноса установлен в 1, значит была ошибка и регистр ah содержит код ошибки (байт состояния). В таблице 1 приведен формат байта состояния для дискеты.

Таблица 1

Байт состояния дискеты

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

Биты

 

7 6 5 4 3 2 1 0

Значение

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

. . . . . . . 1

Неверная команда: неправильный запрос

 

к контроллеру дискеты

. . . . . . 1 .

Плохой адресный маркер: неверная маркировка

 

идентификатора сектора или маркер не найден

. . . . . 1 . .

Плохой сектор: на дискете нет заданного

 

сектора

. . . . 1 . . .

Ошибка прямого доступа к памяти (DMA)

. . . 1 . . . .

Ошибка циклического кода : ошибка в четнос-

 

ти данных при чтении дискеты

. . 1 . . . . .

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

 

контролллера дискеты

. 1 . . . . . .

Ошибка поиска: ошибка при перемещении на

 

заданную дорожку

1 . . . . . . .

Тайм-аут: дисковод не отвечает

. . . . . . 1 1

Ошибка защиты записи: попытка записи на за-

 

щищенную дискету

. . . . 1 . . 1

Ошибка границы DMA: попытка обращения за пре-

 

делы области 64K

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

66

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

67

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 алгоритма можно реализовать с помощью фрагмента программы:

68

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.Текст программы. 7.6.Результаты работы программы. 7.7.Выводы.

69

Лабораторная работа 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, чтобы прог-

70

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]