Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Подготовка к файловым операциям. Часть 2
ОГЛАВЛЕНИЕ
Страница 24 из 41
При таком подходе программе проще помещать данные в FCB, посколь-
ку метки существуют для каждого поля. В зависимости от типа фай-
ловых операций на поля могут накладываться следующие ограничения:
1. Для файлов прямого доступа Вы должны установить размер
записи и номер записи в поле записи прямого доступа.
2. Для доступа к последовательным файлам с начала Вы должны
установить только размер записи, при условии, что Вы инициализи-
ровали поля текущего блока и текущей записи в 0 (просто обнулите
весь FCB, за исключением имен накопителя и файла). При открытии
поле размера записи будет установлено равным 128, если это значе-
ние устаривает Вас, то дальнейшая подготовка не нужна.
3. Для доступа к последовательному файлу с середины или с
конца Вы должны установить поля текущего блока и текущей записи
(в этом случае Ваша программа должна будет производить вычисления
сама).
Префикс программного сегмента [1.3.0] имеет достаточно большое
поле, чтобы содержать управляющий блок файла. Это пространство
предоставляется для каждой программы, поэтому экономно использо-
вать его, особенно в программах типа .COM. Поле FCB расположено
со смещением 5CH в префиксе программного сегмента. В программах
COM используйте ORG для создания FCB следующим образом (здесь
помечен также используемый по умолчанию DTA, который будет обсуж-
даться ниже):
;---в начале кодового сегмента
ORG 5CH
FCB LABEL BYTE
DRIVE_NUM DB 0
FILE_NAME DB 8 DUP(?)
FILE_EXT DB 3 DUP(?)
BLOCK_NUM DW 0
RECORD_SIZE DW 0
FILE_SIZE DD 0
FILE_DATE DW 0
RESERVED DB 10 DUP(0)
CURRENT_REC DB 0
RANDOM_REC DD 0
ORG 80H
DTA LABEL BYTE
ORG 100H
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
...
Расширенный FCB используется для создания или доступа к файлу,
имеющему специальные атрибуты, например, к спрятанному файлу или
файлу только для чтения. Различные атрибуты объяснены в [5.2.6].
Расширенный FCB на 7 байтов длиннее, причем эти 7 байтов пред-
шетсвуют обычному блоку. Первый байт равен FF, что указывает на
специальный статус. За ним следуют 5 байтов ASCII 0, а затем байт
атрибутов. При открытии файла с использованием расширенного FCB
DS:DX должны указывать на первый из дополнительных семи байтов, а
не на имя накопителя, как для обычного FCB. Вот обычная форма,
где 2 - значение байта атрибутов, а 1 - указывает на накопитель:
FCB DB 0FFH, 5 DUP(0),2,1,'FILENAMEEXT',25 DUP(0)
Метод дескриптора файла:
Этот метод требует меньшей подготовки чем метод FCB. Для него
Вы должны только создать строку, указывающую путь к файлу, такую
как в стандартных командах DOS. Например B:COMPILE\UTILITY\PASCAL
указывает на файл PASCAL в подкаталоге UTILITY. Строка ограничена
длиной в 63 символа, включая имя накопителя. При открытии файла
(с использованием функции 3DH прерывания 21H - см. [5.3.3]),
DS:DX должны указывать на первый байт этой строки. Система выпол-
няет всю работу по анализу строки и нахождению файла, а после
того как файл открыт она возвращает 16-битный идентификационный
номер файла в AX. Его называют номером файла и он используется во
всех последующих операциях с этим файлом.
Буфера данных:
Программа должна указать место в памяти, куда должны помещать-
ся принимаемые данные или откуда должны браться выводимые. Это
пространство в памяти может быть временным буфером, который будет
использоваться данными как промежуточная станция. Или это прост-
ранство может быть именно тем местом, где данные реально обраба-
тываются. Обычно временный буфер устанавливается размером в одну
запись и бывает удобно описать его как строковую переменную в
сегменте данных, как это сделано в нижеприведенном примере. С
другой стороны, большие рабочие области данных должны распреде-
ляться с помощью методов распределения памяти, предоставляемых
операционной системой [1.3.1]. Ведь создание, например, области
данных размером в 10000 байт в сегменте данных сделает программу
на диске на 10000 байт длиннее, что совершенно ненужно.
Буфер используемый методом FCB доступа к файлам называется
областью обмена с диском или DTA. На этот буфер указывает словный
указатель, который хранится операционной системой и который может
быть изменен Вашей программой. В фирменной документации этот
указатель на DTA часто сам называют DTA. Поскольку указано только
начало буфера, то ничто не мешает данным занять область прилегаю-
щую к DTA, поэтому Вы сами должны следить, чтобы этого не прои-
зошло. Указатель на DTA устанавливается специальной функцией DOS
и после того как он установлен все функции чтения/записи автома-
тически обращаются к нему. Это означает, что сами функции не
должны содержать адрес временного буфера.
Когда DTA совпадает с областью данных, в которой обрабатывают-
ся данные, то необходимо постоянно менять DTA, с тем чтобы файло-
вые операции могли получать доступ к различным фрагментам данных.
При простой операции последовательного чтения или при операции
чтения одного блока с прямым доступом система автоматически поме-
щает в DTA одну запись за другой. Необходимо отвести пространст-
во, достаточное для числа записей, которые будут затребованы
программой. DTA не может иметь размеры больше одного сегмента
(64K).
Для установки указателя на DTA используйте функцию 1AH преры-
вания 21H. DS:DX должны указывать на первый байт DTA, а затем
надо выполнить функцию. Это все что нужно. Вот пример:
;---в сегменте данных
DTA 256 DUP (?)
;---установка DTA
LEA DX,DTA ;DS:DX указывают на DTA
MOV AH,1AH ;функция установки DTA
INT 21H ;установка DTA
Функция 2FH прерывания 21H сообщает текущую установку указате-
ля DTA. У нее нет входных регистров. При возврате ES:BX содержат
сегмент и смещение DTA.
Префикс программного сегмента [1.3.0] обеспечивает каждую
программу 128-байтным встроенным DTA, начиная со смещения 80H и
до 9FH. Вы можете использовать его при нехватке памяти. Первона-
чально указатель на DTA указывает именно на этот буфер, поэтому
если Вы будете использовать его, то нет нужды устанавливать ука-
затель. Этот буфер по умолчанию особенно удобно использовать с
COM файлами, где DS указывает на начало префикса программного
сегмента. Для файлов EXE может потребоваться небольшой добавочный
код, чтобы использовать DTA по умолчанию. Отметим, что для опре-
деления текущей установки указателя на DTA Вы должны использовать
функцию 2FH прерывания 21H. У нее нет входных регистров, а при
выходе ES:BX указывают на DTA.
Указатель на DTA не используется при доступе к файлу методом
дескриптора файла. Функции чтения или записи данных всегда содер-
жат адрес, по которому расположен буфер данных. Целиком на Вашей
совести лежит определение того, будут ли данные передаваться
через временный буфер или непосредственно в то место, где они
будут использоваться.