PAYROLL.ASM, занимающий относительные сектора 002, 003 и 004. Элемент
оглавления для этого файла содержит имя файла PAYROLL, тип - ASM, шест.00
для обычного файла, дату создания, 002 - номер первого относительного
сектора файла и размер файла в битах. Таблица FAT в этом случае может
выглядеть следующим образом (кроме того, что в каждой паре байты в
обратной последовательности):
Элемент FAT: |FDF|FFF|003|004|FFF|000|000|...|000|
Относительн.сектор: 0 1 2 3 4 5 6 ...конец
Первые два элемента FAT указывают расположение каталога на
относительных секторах 000 и 001. Для ввода рассматриваемого файла в
память, система выполняет следующие действия:
1. DOS получает доступ к дискете и ищет в каталоге имя PAYROLL и
тип ASM.
2. Затем DOS определяет по каталогу положение первого
относительного сектора файла (002) и загружает содержимое этого
сектора в буферную область в основной памяти.
3. Номер второго сектора DOS получает из элемента FAT,
соответствующего относительному сектору 002. Из диаграммы,
приведенной выше, видно, что этот элемент содержит 003. Это
обозначает, что файл продолжается в относительном секторе 003. DOS
загружает содержимое этого сектора в буфер в основной памяти.
4. Номер третьего сектора DOS получает из элемента FAT,
соответствующего относительному сектору 003. Этот элемент содержит
004, значит файл продолжается в относительном секторе 004. DOS
загружает содержимое этого сектора в буфер в основной памяти.
5. Элемент FAT для относительного сектора 004 содержит шест.FFF,
что свидетельствует о том, что больше нет данных для этого файла.
Элемент каталога содержит номер начального кластера для каждого
файла, а FAT - шест.трехзначные элементы, указывающие на расположение
каждого дополнительного кластера, если он имеется. Для того, чтобы
указать, например, что файл содержит все записи только в первом кластере,
таблица FAT должна содержать шест.FFF в элементе, представляющем первый
относительный кластер.
В качестве простого примера рассмотрим элемент каталога, указывающий,
что некоторый файл начинается в относительном кластере 15. Для локализации
первого элемента таблицы FAT необходимо:
- Умножить 15 на 1,5, получим 22,5.
- Выполнить выборку содержимого байтов 22 и 23 из FAT.
Предположим, что они содержат F*FF.
- Переставить байты: FFF*.
- Так как номер 15-нечетный, то первые три цифры - FFF указывают
на отсутствие других кластеров для данного файла.
Теперь рассмотрим файл, который занимает четыре кластера,
начинающихся с номера 15. Таблица FAT, начиная с байта 22 и далее, в этот
pаз показана в правильной обратной последовательности байтов в паpах:
6* 01 17 80 01 FF*F
Для того, чтобы найти первый элемент FAT, необходимо умножить 15 на 1,5,
получим 22,5, и выбрать содержимое байтов 22 и 23, как в предыдущем
примере. В этот раз эти байты содержат 6*01, что после перестановки байт
даст 016*. Так как 15-число нечетное, то используются первые три цифры
016. Второй кластер для файла, следовательно, имеет номер 016.
Для того, чтобы найти третий кластер, необходимо умножить 16 на 1,5
получим 24. Затем следует выбрать содержимое байтов 24 и 25 таблицы FAT.
Значение 1780 после перестановки байтов даст 8017. Так как число 16
четное, то используются последние три цифры 017. Третий кластер для файла
имеет номер 017.
Для того, чтобы найти четвертый кластер, необходимо умножить 17 на
1,5, получим 25.5. Затем следует выбрать содержимое байтов 25 и 26 таблицы
FAT. Значение 8001 после перестановки байтов даст 0180. Так как число 17
нечетное, то используются первые три цифры 018. Четвертый кластер для
файла имеет номер 018.
При использовании этой же процедуры для локализации содержимого
следующего элемента FAT по относительным адресам 27 и 28, получим FF*F,
что после перестановки даст *FFF. Так как число 18 четное, используются
последние три цифры FFF, что обозначает последний элемент.
Как было ранее сказано, все файлы начинаются на границе кластеpа.
Кроме того, совсем не обязательно файл должен храниться в соседних
кластерах, он может быть разбросан на диске по разным секторам.
Если в программе необходимо определить тип установленного диска, то
можно обратиться к таблице FAT непосредственно, или, что предпочтительней,
использовать функцию DOS 1BH или 1CH.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Независимо от размеров все файлы начинаются на границе кластера.
- Оглавление (каталог) содержит для каждого файл на диске элементы,
определяющие имя, тип, атрибуты, дату, начальный сектор и pазмер файла.
- Таблица распределения файлов (FAT) содержит один элемент для
каждого кластеpа в каждом файле.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________
15.1. Какую длину в байтах имеет стандартный сектор?
15.2. Где расположена запись начальной загрузки?
15.3. Как обозначаются в оглавлении удаленные файлы?
15.4. Какие дополнительные действия выполняются при форматизации
дискеты по команде DOS FORMAT /S?
15.5. Где и каким образом обозначается в таблице FAT, что устройством
является твердый диск?
15.6. Имеется файл размером 2890 (десятичное) байтов: а) Где хранит
cистема размер файла? б) Как выражается этот размер в шестнадцатиричном
формате? в) Покажите значение в том виде, как оно записывается системой.
ГЛАВА 16 Дисковая память II: Функции базовой версии DOS
__________________________________________________________________________
Ц е л ь: Раскрыть основные требования к программированию функций
базовой версии DOS для обработки дисковых файлов.
ВВЕДЕНИЕ
________________________________________________________________
В начале данной главы рассматриваются функции базовой версии DOS,
определяющие блок управления файлом (FCB), а затем будут показаны
возможности создания и обработки дисковых файлов последовательным и прямым
доступом. Все рассматриваемые операции были введены в первых версиях DOS и
возможны во всех последующих версиях.
Обработка дисковых файлов в базовой DOS включает определение блока
управления файлом (FCB - file control block), который описывает файл и его
записи. Передача адреса блока FCB в DOS обязательна для всех дисковых
операций ввода-вывода. Новых команд ассемблера в данной главе не
потребуется.
Управление вводом и выводом осуществляется специальными прерываниями.
Запись файла на диск требует, чтобы прежде он был "создан" и DOS смогла
сгенерировать соответствующий элемент в оглавлении. Когда все записи файла
будут записаны, программа должна "закрыть" файл, так, чтобы DOS завершила
обработку оглавления. Чтение файла требует, чтобы он был сначала "открыт"
для того, чтобы убедиться в его существовании. Так как записи имеют
фиксированную длину и в силу соответствующей организации оглавления,
обработка записей дискового файла может осуществляться как
последовательно, так и произвольно.
Метод доступа к дисковой памяти, поддерживающий использование
оглавления, "блокирование" и "разблокирование" записей, обеспечивается
прерыванием DOS 21H. Более низкий уровень, обеспечивающий абсолютную
адресацию дисковых секторов, также через DOS, выполняется посредством
прерываний 25H и 26H. Самый низкий уровень обеспечивается прерыванием BIOS
13H, которое позволяет выполнить произвольную адресацию в дисковой памяти
по номеру дорожки и сектора. Методы DOS осуществляют некоторую
предварительную обработку до передачи управления в BIOS. В гл.17
объясняется применение предпочтительных функций расширенного DOS 2, а
гл.18 представляет основные дисковые операции в BIOS. Напоминание: Термин
кластер определяет один или более секторов с данными в зависимости от
дискового устройства.
БЛОК УПРАВЛЕНИЯ ФАЙЛОМ (FCB)
________________________________________________________________
Для выполнения операций ввода-вывода на диске в базовой DOS
необходимо в области данных определить блок FCB. Блок FCB не поддерживает
путь доступа к файлу, поэтому он используется главным образом для
обработки файлов в текущей директории. Блок FCB содержит описание файла и
его записей в приведенном ниже формате. Пользователь должен
инициализировать байты 0-15 и 32-36, байты 16-31 устанавливаются DOS:
Байты Назначение
0 Указывает дисковод: 01 для дисковода A, 02 для B и т.д.
1-8 Имя файла, выравненное по левой границе с конечными пробелами,
если имя меньше 8 байт. Поле может содержать зарезервированные
имена, например, LPT1 для принтера.
9-11 Тип файла для дополнительной идентификации, например, DTA или
ASM. Если тип файла меньше трех байт, то он должен быть выравнен
по левой границе и дополнен конечными пробелами. DOS хранит имя
и тип файла в оглавлении.
12-13 Номер текущего блока. Блок содержит 128 записей. Для локализации
конкретной записи используется номер текущего блока и номер
текущей записи (байт 32). Первый блок файла имеет номер 0,
второй - 1 и т.д. Операция открытия файла устанавливает в данном
поле 0.
14-15 Логический размер записи. Операция открытия инициализирует
размер записи значением 128 (шест.80). После открытия и перед
любой операцией чтения или записи можно устанавливать в данном
поле любое требуемое значение длины записи.
16-19 Размер файла. При создании файла DOS вычисляет и записывает это
значение (произведение числа записей на размер записей) в
оглавление. Операция открытия выбирает размер файла из
оглавления и заносит его в данное поле. Программа может читать
это поле, но не может менять его.
20-21 Дата. При создании или последней модификации файла DOS
записывает дату в оглавление. Операция открытия выбирает дату из
оглавления и заносит в данное поле.
22-31 Зарезервировано для DOS.
32 Текущий номер записи. Данное поле содержит текущий номер записи
(0-127) в текущем блоке (см. байты 12-13). Система использует
текущие значения блока и записи для локализации записи в
дисковом файле. Обычно номер начальной записи в данном поле - 0,
но его можно заменить для начала последовательной обработки на
любое значение от 0 до 127.
33-36 Относительный номер записи. Для произвольного доступа при
операциях чтения или записи данное поле должно содержать
относительный номер записи. Например, для произвольного чтения
записи номер 25 (шест.19), необходимо установить в данном поле
шест.19000000. Произвольный доступ характеризуется тем, что
система автоматически преобразует относительный номер записи в
текущие значения блока и записи. Ввиду ограничения на
максимальный размер файла (1.073.741.824 байтов), файл с
короткими записями может содержать больше записей и иметь
больший относительный номер записи. Если размер записи больше