Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 49 50 51 52 53 54 55  56 57 58 59 60 61 62 ... 92
помечен также используемый по умолчанию 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-байтный элемент данных.  С
другой стороны, очень большие элементы данных, такие как парагра-
фы  текста,  могут быть разделены на несколько  элементов  данных
(стандартный текстовый файл представляет из себя документ, разби-
тый  на  строки удобного  размера,  записанные  последовательно).
Поскольку элементы данных имеют  переменную  длину, то невозможно
узнать  где в файле расположен определенный элемент.  Поэтому для
того чтобы найти  нужный  элемент  программа  должна читать файл,
Предыдущая страница Следующая страница
1 ... 49 50 51 52 53 54 55  56 57 58 59 60 61 62 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама