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

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 (сдвиг вправо).

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. Для выделения полей времени и даты использовать выраже-

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

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

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

ны в п. 4.

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

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

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

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

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

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

Лабораторная работа 8 СТРУКТУРА ТАБЛИЦЫ РАЗМЕЩЕНИЯ ФАЙЛОВ FAT

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

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

практических навыков определения последовательностей кластеров,

принадлежащих одному файлу.

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

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

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

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

Диск использует таблицу размещения файлов (FAT) для отведения

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

секторах. Из соображений безопасности на всех дисках хранятся по

две копии FAT. Они хранятся последовательно начиная с первого сек-

тора FAT. Для дискеты первым сектором FAT будет сектор, следующий

за корневым сектором, т.е. сектор с координатами: дорожка 0, сто-

рона 0, сектор 2. Для жесткого диска первый сектор FAT определяет-

ся с помощью таблицы разделов и таблицы корневого сектора (см.

лаб. раб. "Структура дисков"). Число секторов, занимаемых FAT, оп-

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

го сектора.

Таблица размещения файлов хранит информацию о каждом кластере

файла на диске. Кластер - это группа смежных секторов. Величина

кластера,которая для разных типов дисков и форматов может быть

разной, указывается в таблице корневого сектора. Кластеры были

введены с целью уменьшения размера 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:

-Файл 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. При этом регистры

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

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

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