помечен также используемый по умолчанию 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. Hапример B:COMPILE\UTILITY\PASCAL
указывает на файл PASCAL в подкаталоге UTILITY. Строка ограничена
длиной в 63 символа, включая имя накопителя. При открытии файла
(с использованием функции 3DH прерывания 21H - см. [5.3.3]),
DS:DX должны указывать на первый байт этой строки. Система выпол-
няет всю работу по анализу строки и нахождению файла, а после
того как файл открыт она возвращает 16-битный идентификационный
номер файла в AX. Его называют номером файла и он используется во
всех последующих операциях с этим файлом.
Буфера данных:
Программа должна указать место в памяти, куда должны помещать-
ся принимаемые данные или откуда должны браться выводимые. Это
пространство в памяти может быть временным буфером, который будет
использоваться данными как промежуточная станция. Или это прост-
ранство может быть именно тем местом, где данные реально обраба-
тываются. Обычно временный буфер устанавливается размером в одну
запись и бывает удобно описать его как строковую переменную в
сегменте данных, как это сделано в нижеприведенном примере. С
другой стороны, большие рабочие области данных должны распреде-
ляться с помощью методов распределения памяти, предоставляемых
операционной системой [1.3.1]. Ведь создание, например, области
данных размером в 10000 байт в сегменте данных сделает программу
на диске на 10000 байт длиннее, что совершенно ненужно.
Буфер используемый методом FCB доступа к файлам называется
областью обмена с диском или DTA. Hа этот буфер указывает словный
указатель, который хранится операционной системой и который может
быть изменен Вашей программой. В фирменной документации этот
указатель на DTA часто сам называют DTA. Поскольку указано только
начало буфера, то ничто не мешает данным занять область прилегаю-
щую к DTA, поэтому Вы сами должны следить, чтобы этого не прои-
зошло. Указатель на DTA устанавливается специальной функцией DOS
и после того как он установлен все функции чтения/записи автома-
тически обращаются к нему. Это означает, что сами функции не
должны содержать адрес временного буфера.
Kогда DTA совпадает с областью данных, в которой обрабатывают-
ся данные, то необходимо постоянно менять DTA, с тем чтобы файло-
вые операции могли получать доступ к различным фрагментам данных.
При простой операции последовательного чтения или при операции
чтения одного блока с прямым доступом система автоматически поме-
щает в DTA одну запись за другой. Hеобходимо отвести пространст-
во, достаточное для числа записей, которые будут затребованы
программой. 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 не используется при доступе к файлу методом
дескриптора файла. Функции чтения или записи данных всегда содер-
жат адрес, по которому расположен буфер данных. Целиком на Вашей
совести лежит определение того, будут ли данные передаваться
через временный буфер или непосредственно в то место, где они
будут использоваться.
5.3.6 Анализ информации командной строки.
При запуске многие программы позволяют пользователю поместить
добавлчную информацию в командной строке, обычно указывающую имя
файла, с которым программа будет работать. Эта информация записы-
вается в 128-байтную область, начинающуюся со смещения 80H в
префиксе программного сегмента [1.3.0]. (Эта же область исполь-
зуется как DTA по умолчанию, как обсуждалось в [5.3.5].) Первый
байт содержит длину строки, а затем идет сама строка.
Для программ, использующих метод дескриптора файла для работы
с файлами, имя файла, вводимое в командной строке, должно иметь
адекватную форму. Требуется, чтобы пользователь программы исполь-
зовал стандартный протокол MS DOS для строки пути. С другой сто-
роны, управляющий блок файла требует, чтобы строка вида 'A:ACCT.-
BAK' была преобразована к виду 1,'ACCT BAK'. MS DOS имеет
специальную функцию, которая выполняет такое преобразование над
первой порцией информации, следующей за именем программы в ко-
мандной строке. Эта процедура называется разбором строки (par-
sing).
Средний уровень.
Имя файла должно быть первой информацией, следующей за именем
загружаемой программы. Оно должно быть отделено от имени програм-
мы одним из следующих символов : . ; , = + табуляцией или пробе-
лом. Kонец имени файла должен быть указан одним из символов : . ;
, = + \ < > | / " [ ] табуляцией, пробелом или одним из управляю-
щих символов (коды ASCII от 1 до 31).
Функция 29H прерывания 21H производит разбор имени файла.
DS:SI должны указывать на смещение 81H в PSP. Помните, что при
загрузке программы как DS, так и ES указывают на начало PSP.
ES:DI должны указывать на область памяти, которая будет служить
управляющим блоком для нового файла. Установка битов в AL опреде-
ляет как будет выполняться разборка. Имеют значение только биты
0-3:
бит 0 1 = начальный ограничитель игнорируется
1 1 = байт, идентифицирующий накопитель, устанавливается
в FCB, только если он указан в командной строке
2 1 = имя файла в FCB меняется только если командная
строка содержит имя файла
3 1 = расширение файла в FCB меняется только если коман-
ная строка содержит расширение файла
После того как эта информация установлена, программа может вызы-
вать функцию. Если в командной строке не указан накопитель, то
берется накопитель по умолчанию. Если отсутствует расширение
файла, то предполагается, что оно пробельное (ASCII 32). Если в
имени файла указана звездочка, то она заменяется на нужное число
вопросительных знаков в поле имени файла FCB. AL возвращает 1,
если имя файла содержит * или ? и FF, если указан неверный нако-
питель.
При возврате DS:SI указывают на первый символ, следующий за
именем файла, которое начинается со смещения 81H. Дальнейшая
информация, содержащаяся в командной строке должна расшифровы-
ваться Вашей программой. ES:DI указывают на первый байт вновь
сформированного FCB. Если в FCB не создано допустимого имени
файла, то содержимое ES:[DI]+1 равно пробелу. Вот пример, который
помещает код в область FCB в PSP, начиная со смещения 5CH:
;---разбираем командную строку, создавая FCB со смещением 5CH
;---в PSP
MOV AH,29H ;
MOV SI,81H ;
MOV DI,5CH ;
MOV AL,1111B ;
INT 21H ;
MOV AL,ES:[DI]+1 ;
CMP AL,32 ;
JE ERROR_ROUTINE ;
Раздел 4. Чтение и запись файла.
Имеются два основных метода доступа к файлу - последовательный
и прямой. Хотя в вычислительной литературе часто используют тер-
мины "последовательный" файл и файл "прямого доступа", сами по
себе файлы хранятся на диске одинаково: как непрерывная последо-
вательность байтов. Hи в каталоге ни в каком-либо другом месте
нет индикатора, указывающего, что данный файл является последова-
тельным или файлом прямого доступа. Реально эти два типа файлов
различаются по расположению данных в них и по методу доступа к
ним. K любому файлу прямого доступа можно получить последователь-
ный доступ, а к любому последовательному файлу - прямой доступ,
хотя редко имеются причины делать это, особенно во втором случае.
Последовательные файлы помещают элементы данных один за дру-
гим, независимо от их длины, разделяя эти элементы парой симво-
лов, сначала возвратом каретки (ASCII 13), а затем переводом
строки (ASCII 10). Языки высокого уровня, такие как Бейсик,
вставляют эти символы автоматически, в то время как программы на
ассемблере должны сами заботиться о вставке этих символов после
записи каждой переменной в файл. В последовательных файлах могут
храниться как числа, так и строки. Строки требуют по одному байту
на каждый символ строки. Числа по соглашению записываются в стро-
ковом виде, хотя они могут писаться и в числовом виде. Таким
образом Бейсик записывает значение "128" в виде строки из трех
цифр, хотя программа на ассемблере может записать это число в
виде двухбайтного целого или даже однобайтного кода - все опреде-
ляется тем, что при повторном чтении файла программа должна пони-
мать используемый формат. Для соместимости рекомендуется записы-
вать числа в виде строк.
Hеобязательно, чтобы каждое число строки было отделено парой
возврат каретки/перевод строки, однако если эта пара опущена, то
программа должна обеспечить способ отделения данных. Hапример, 10
целых чисел могут быть записаны как 20-байтный элемент данных. С
другой стороны, очень большие элементы данных, такие как парагра-
фы текста, могут быть разделены на несколько элементов данных
(стандартный текстовый файл представляет из себя документ, разби-
тый на строки удобного размера, записанные последовательно).
Поскольку элементы данных имеют переменную длину, то невозможно
узнать где в файле расположен определенный элемент. Поэтому для
того чтобы найти нужный элемент программа должна читать файл,