Страница 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 не используется при доступе к файлу методом дескриптора файла. Функции чтения или записи данных всегда содер- жат адрес, по которому расположен буфер данных. Целиком на Вашей совести лежит определение того, будут ли данные передаваться через временный буфер или непосредственно в то место, где они будут использоваться.
|