Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3078

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

указатель на 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 не используется при доступе к файлу методом

дескриптора файла. Функции чтения или записи данных всегда содер-

жат адрес, по которому расположен буфер данных. Целиком на Вашей

совести лежит определение того, будут ли данные передаваться

через временный буфер или непосредственно в то место, где они

будут использоваться.



5.3.6 Анализ информации командной строки.




При запуске многие программы позволяют пользователю поместить

добавлчную информацию в командной строке, обычно указывающую имя

файла, с которым программа будет работать. Эта информация записы-

вается в 128-байтную область, начинающуюся со смещения 80H в

префиксе программного сегмента [1.3.0]. (Эта же область исполь-


зуется как DTA по умолчанию, как обсуждалось в [5.3.5].) Первый

байт содержит длину строки, а затем идет сама строка.



Для программ, использующих метод дескриптора файла для работы

с файлами, имя файла, вводимое в командной строке, должно иметь

адекватную форму. Требуется, чтобы пользователь программы исполь-

зовал стандартный протокол MS DOS для строки пути. С другой сто-

роны, управляющий блок файла требует, чтобы строка вида 'A:ACCT.-

BAK' была преобразована к виду 1,'ACCT BAK'. MS DOS имеет

специальную функцию, которая выполняет такое преобразование над

первой порцией информации, следующей за именем программы в ко-

мандной строке. Эта процедура называется разбором строки (par-

sing).


Средний уровень.


Имя файла должно быть первой информацией, следующей за именем

загружаемой программы. Оно должно быть отделено от имени програм-

мы одним из следующих символов : . ; , = + табуляцией или пробе-

лом. Конец имени файла должен быть указан одним из символов : . ;

, = + \ < > | / " [ ] табуляцией, пробелом или одним из управляю-

щих символов (коды 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. Чтение и запись файла.




Имеются два основных метода доступа к файлу - последовательный

и прямой. Хотя в вычислительной литературе часто используют тер-

мины "последовательный" файл и файл "прямого доступа", сами по

себе файлы хранятся на диске одинаково: как непрерывная последо-

вательность байтов. Ни в каталоге ни в каком-либо другом месте

нет индикатора, указывающего, что данный файл является последова-

тельным или файлом прямого доступа. Реально эти два типа файлов

различаются по расположению данных в них и по методу доступа к

ним. К любому файлу прямого доступа можно получить последователь-

ный доступ, а к любому последовательному файлу - прямой доступ,

хотя редко имеются причины делать это, особенно во втором случае.

Последовательные файлы помещают элементы данных один за дру-

гим, независимо от их длины, разделяя эти элементы парой симво-

лов, сначала возвратом каретки (ASCII 13), а затем переводом

строки (ASCII 10). Языки высокого уровня, такие как Бейсик,

вставляют эти символы автоматически, в то время как программы на

ассемблере должны сами заботиться о вставке этих символов после

записи каждой переменной в файл. В последовательных файлах могут

храниться как числа, так и строки. Строки требуют по одному байту

на каждый символ строки. Числа по соглашению записываются в стро-

ковом виде, хотя они могут писаться и в числовом виде. Таким

образом Бейсик записывает значение "128" в виде строки из трех

цифр, хотя программа на ассемблере может записать это число в

виде двухбайтного целого или даже однобайтного кода - все опреде-

ляется тем, что при повторном чтении файла программа должна пони-

мать используемый формат. Для соместимости рекомендуется записы-

вать числа в виде строк.

Необязательно, чтобы каждое число строки было отделено парой

возврат каретки/перевод строки, однако если эта пара опущена, то

программа должна обеспечить способ отделения данных. Например, 10

целых чисел могут быть записаны как 20-байтный элемент данных. С

другой стороны, очень большие элементы данных, такие как парагра-

фы текста, могут быть разделены на несколько элементов данных

(стандартный текстовый файл представляет из себя документ, разби-

тый на строки удобного размера, записанные последовательно).

Поскольку элементы данных имеют переменную длину, то невозможно

узнать где в файле расположен определенный элемент. Поэтому для

того чтобы найти нужный элемент программа должна читать файл,

начиная с начала и отсчитывая нужное число пар возврат карет-

ки/перевод строки. По этой причине файлы такого формата называют

последовательными. Как правило с диска в память передается весь

такой файл.

Файлы прямого доступа заранее отводят фиксированное место под


каждый элемент данных. Если какой-то элемент данных не занимает

все отведенное пространство, то остаток заполняется пробелами.

Если каждый элемент занимает 10 байтов, то легко можно просмот-

реть сразу 50-й элемент, поскольку можно вычислить что он начи-

нается с 491-го байта файла (т.е. с байта #490, поскольку отсчет

начинается с 0). Как правило связанный набор элементов группи-

руется в запись. Каждая запись содержит несколько полей, которые

создают набор номеров байтов, начиная с которых пишутся данные

элементы. Например, запись может иметь поля возраст, вес и рост.



Соответствующие поля могут занимать 2, 3 и 5 байтов. Вместе они

образуют запись длиной в 10 байтов. Файл прямого доступа может

состоять из тысяч таких записей. Каждая запись следует непос-

редственно за предшествующей без всяких ограничителей, таких как

пары возврат каретки/перевод строки, используемые в последова-

тельных файлах. При этом записи могут писаться в любом порядке и

можно записать запись 74, хотя запись 73 еще не была записана

(при этом записи 73 отведено дисковое пространство и она будет

содержать те данные, которые случайно оказались в том секторе, в

котором отведено место для этой записи). В отличии от последова-

тельных файлов файлы прямого доступа остаются на диске. В памяти

присутствуют только определенные записи, с которыми идет работа в

данный момент времени.

Когда для прямого доступа к файлу используется управляющий

блок файла, то системе сообщается размер записи файла (все записи

данного файла должны иметь одинаковую длину). Это позволяет прог-

рамме запросить любую запись по номеру, а MS DOS точно вычислит

где эта запись расположена на диске. При работе с файлами прямого

доступа методом дескриптора файла программа должна сама вычислять

положение требуемой записи.

Система хранит файловый указатель для каждого буфера файла. Он

указывает на n-ный байт файла, определяя место в файле, с которо-

го будет начинаться следующая операция чтения или записи. При

последовательной операции перезаписи файловый указатель первона-

чально устанавливается на начало файла и постоянно сдвигается по

мере того, как все новые и новые данные записываются в файл.

Когда данные добавляются к последовательному файлу, то файловый

указатель первоначально устанавливается на конец файла. При дос-

тупе к одной записи в файле прямого доступа положение записи

вычисляется в виде смещения относительно начала файла и указатель

устанавливается равным этому значению; затем нужная запись чи-

тается или пишется. Обычно за файловым указателем следит система,

однако программа может сама управлять им и манипулировать указа-

телем для своих специальных нужд.

Единственным примером низкого уровня в данном разделе является

чтение/запись одного сектора. Чтение или запись целых файлов


состоит в последовательности таких чтений или записей одного

сектора, программируя микросхему контроллера НГМД заново для

каждого сектора. Полномасштабные файловые операции очень сложны

на этом уровне, что следует хотя бы из больших размеров файла

COMMAND.COM. Однако, изучив обсуждение операций низкого уровня, а

также имея информацию о таблице размещения файлов [5.1.1] и дис-

ковых каталогах [5.2.1] Вы можете представить как работает дис-

ковая операционная система.



5.4.1 Программирование контроллера НГМД 765 и микросхемы

прямого доступа к памяти 8237.




Микросхема контроллера НГМД 765 фирмы NEC управляет мотором и

головками накопителя на дискетах и обрабатывает потоки данных,

направляемые в или из дисковых секторов. Один контроллер, уста-

новленный на плате адаптора дисков, может обслуживать до четырех



НГМД. За исключением случаев, связанных с защитой от копирования,

программистам не приходится программировать микросхему контролле-

ра НГМД прямо. Процедуры работы с дисками, предоставляемые DOS и

BIOS эффективны и удобны, кроме того, очень рисковано писать свои

собственные процедуры, поскольку ошибки в них могут разрушить

дисковый каталог или таблицу размещения файлов, что вызовет пол-

ное разрушение информации на диске.

Нижеследующее обсуждение служит цели дать Вам только общее

представление. Листинг ROM-BIOS, приведенный в конце каждого

технического руководства по MS DOS, содержит код тщательно разра-

ботанных процедур для форматирования дискет, чтения и записи

секторов, а также сброса и получения статуса накопителей. После

того, как Вы усвоите приведенный здесь материал, изучите процеду-

ры ROM-BIOS для продолжения Вашего образования в области операций

с дисками на низком уровне. Вам потребуется также документация по

микросхеме контроллера НГМД 8272A фирмы Intel, которая аналогична

микросхеме фирмы NEC. В данной документации перечислены прерыва-

ния, генерируемые контроллером НГМД, в то время как в документа-

ции по IBM PC этого списка нет. Информация о микросхеме 8272A

может быть найдена во втором томе Справочника по компонентам

микросистем (Microsystem Components Handbook).

Контроллер НГМД может выполнять 15 операций, из которых здесь

будут обсуждаться только три: операции поиска и чтения или записи

одного сектора. Понимание того как они работают позволит Вам

выполнить любую из оставшихся двенадцати, при условии, что у Вас

будет вышеупомянутая информация. Чтение файла состоит в поиске

его в каталоге [5.2.1], определении его положения на диске с

помощью таблицы размещения файлов [5.1.1] и затем наборе операций

чтения одного сектора. Эта процедура включает 6 шагов:


1. Включение мотора и короткое ожидание, пока он наберет обороты.

2. Выполнение операции поиска и ожидание прерывания, указывающего

на завершение этой операции.