Страница:
DB 199 DUP(40H) ;Пробелы в коде EBCDIC
Команда XLAT предполагает адрес таблицы в регистре BX, а
транслируемый байт (например, поля ASCNO) в регистре AL.
Следующие команды выполняют подготовку и трансляцию байта:
LEA BX,XLTBL
MOV AL,ASCNO
XLAT
Команда XLAT использует значение в регистре AL в качестве
относительного aдреса в таблице, т.е. складывает адрес в BX
и смещение в AL. Если, например, ASCNO содержит 00, то адрес
байта в таблице будет XLTBL+00 и команда XLAT заменит 00 на
шест.40 из таблицы. Если поле ASCNO cодержит шест.32, то
адрес соответствующего байта в таблице будет XLTBL+50. Этот
байт содержит шест.F2 (2 в коде EBCDIC), который команда
XLAT загружает в регистр AL.
------------------------------------------------------------
------------------------------------------------------------
Рис.14.4. Преобразование ASCII в EBCDIC.
В программе на рис.14.4 добавлено преобразование
десятичной точки (2E) и знака минус (2D) из кода ASCII в код
EBCDIC (4B и 60 соответственно). В программе организован
цикл для обработки шестибайтового поля. Поле ASCNO в начале
выполнения программы содержит значение 31.5 с последующим
пробелом, или шест.2D33312E3520. В конце выполнения програм
мы в поле EBCNO должно быть шест. 60F3F14BF540.
ПРОГРАММА: ОТОБРАЖЕНИЕ ШЕСТ. И ASCII-КОДОВ
------------------------------------------------------------
Программа, приведенная на рис.14.5, отображает на экране
почти все ASCII-символы, а также их шест.значения. Например,
ASCII-символ для шест.53 - это буква S, эти данные программа
выводит в виде 53 S. Полное изображение на экране выглядит в
виде матрицы 16х16:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
------------------------------------------------------------
Ассемблер для IBM PC. Глава 14 31
------------------------------------------------------------
Рис.14.5. Отображение шест. и ASCII-кодов
Как было показано еще на рис.8.1, отображение ASCII-
символов, oсобых проблем не вызывает. Что же касается
отображения шест.значений в символах ASCII, то этот процесс
более сложный. Например, для вывода на экран в коде ASCII
шест. 00, 01 и т.д. необходимо преобразовать шест.00 в шест.
3030, шест.01 в шест.3031 и т.д.
В программе начальное значение поля HEXCTR равно 00. Это
значение последовательно увеличивается на 1. Процедура
C10HEX расщепляет байт HEXCTR на две щест.цифры.
Предположим, что байт HEXCTR содержит шест. 4F. Процедура
сначала выделяет шест.цифру 4 и использует это значение для
перекодировки по таблице XLATAB. В регистре AL устанавливает
ся в результате значение шест.34. Затем процедура выделяет
вторую шест.цифру F и перекодирует ее в шест.46. В
результате oбработки получается шест.3446, что отображается
на экране как 4F.
Так как функция DOS для вывода на экран (шест.40)
рассматривает шест.1A как конец файла, то в программе
это значение заменяется на пробел. Программа, использующая
для вывода на экран функцию DOS (шест.09), дожна заменять
символ ограничитель '$' на пробел.
Существует много различных способов преобразования
шест.цифр в ASCII-символы. Можно поэкспериментировать с
операциями сдвига и сравнения.
ПРОГРАММА: СОРТИРОВКА ЭЛЕМЕНТОВ ТАБЛИЦЫ
------------------------------------------------------------
Часто возникает необходимость сортировки элементов
таблицы в восходящем или нисходящем порядке. Например,
пользователю может потребоваться список наименований
товара в алфавитном порядке или список общих цен в
нисходящей последовательности. Обычно, табличные данные не
определяются как в предыдущей программе, а загружаются с
клавиатуры или с диска. Данный раздел посвящен сортировке
элементов таблицы, что касается различных применений,
включающих сортировку записей на дисках, то здесь возможны
более сложные программы.
Существует несколько алгоритмов сортировки таблиц от
неэффективных, но понятных, до эффективных и непонятных.
Программа сортировки, предлагаемая в данном разделе, весьма
эффективна и может применяться для большенства табличных
сортировок. Конечно, если не проверить различные алгоритмы
сортировок, то даже самая неэффективная программа может
показаться работающей со скоростью света. Но цель данной
книги - показать технику ассемблера, а не сортировки.
Основной подход заключается в сравнении соседних элементов
таблицы. Если первый элемент больше второго, то элементы
меняются местами. Таким образом выполняется сравнение
элементов 1 со 2, 2 с 3 и т.д. до конца таблицы с
Ассемблер для IBM PC. Глава 14 32
перестановкой элементов там, где это необходимо. Если в
проходе были сделаны перестановки, то весь процесс повторяет
ся с начала таблицы т.е. сравниваются снова элементы 1-2,
2-3 и т.д. Если в проходе не было перестановок, то таблица
отсортирована и можно прекратить процесс.
Ниже приведен алгоритм, в котором переменная SWAP
является индикатором: была перестановка элементов (YES) или
нет (NO):
G10: Определить адрес последнего элемента
G20: Установить SWAP=NO
Определить адрес первого элемента
G30: Элемент > следующего элемента?
Да: Представить элементы
Установить SWAP=YES
Перейти к следующему элементу
Конец таблицы?
Нет: Перейти на G30
Да: SWAP=YES?
Да: Перейти на G20 (повторить сорт.)
Нет: Конец сортировки
Программа, показанная на рис.14.6, обеспечивает ввод с
клавиатуры до 30 имен, сортировку введенных имен в алфавит
ном порядке и вывод на экран отсортированного списка имен.
------------------------------------------------------------
------------------------------------------------------------
Рис.14.6. Сортировка таблицы имен.
ОПЕРАТОРЫ ТИПА, ДЛИНА И РАЗМЕРА
------------------------------------------------------------
Ассемблер содержит ряд специальных операторов, которые
могут оказаться полезными при программировании. Например,
при изменении длины таблицы придется модифицировать
программу (для нового определения таблицы) и процедуры,
проверяющие конец таблицы. В этом случае использование
операторов TYPE (тип), LENGTH (длина) и SIZE (размер)
позволяют уменьшить число модифицируемых команд.
Рассмотрим определение следующей таблицы из десяти слов:
TABLEX DW 10 DUP(?) ;Таблица из 10 слов
Программа может использовать оператор TYPE для определения
типа (DW в данном случае), оператор LENGTH для определения
DUP-фактора (10) и оператор SIZE для определения числа
байтов (10 х 2 = 20). Следующие команды иллюстрируют три
таких применения:
MOV AX,TYPE TABLEX ;AX=0002
MOV BX,LENGTH TABLEX ;BX=000A (10)
MOV CX,SIZE TABLEX ;CX=0014 (20)
Ассемблер для IBM PC. Глава 14 33
Значения LENGTH и SIZE можно использлвать для окончания
табличного поиска или сортировки. Например, если регистр SI
содержит продвинутый адрес таблицы при осуществлении поиска,
то проверка на конец таблицы может быть следующий:
CMP SI,SIZE TABLEX
В главе 23 "Справочник по директивам ассемблера" дается
детальное описание операторов TYPE, LENGTH и SIZE.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------
ъ Для большинства применений, определяйте таблицы,
имеющие родственные элементы одной длины и формата
данных.
ъ Стройте таблицы на основе форматов данных. Например,
элементы могут быть символьные или числовые длиной
один, два и более байтов каждый. Может оказаться более
практичным определение двух таблиц: одна, например, для
трехсимвольных значений номеpов, а другая для
двухбайтовых значений цен единиц товара. В процессе
поиска адрес элементов таблицы номеров должен увеличи
ваться на 3, а адрес элементов таблицы цен - на 2. Если
сохранить число выполненных циклов при поиске на равно,
то, умножив это число на 2 (SHL сдвиг влево на один
бит), получим относительный адрес искомого значения
цены. (Начальное значение счетчика циклов должно быть
равно -1).
ъ Помните, что DB позволяет определять значения, не
превышающие 256, а DW записывает байты в обратной
последовательности. Команды CMP и CMPSW предполагают,
что байты в сравниваемых словах имеют обратную
последовательность.
ъ Если таблица подвергается частым изменениям, или должна
быть доступна нескольким программам, то запишите ее на
диск. Для внесения изменений в таблицу можно
разработать специальную программу модификации. Любые
программы могут загружать таблицу с диска и при
обновлениях таблицы сами программы не нуждаются в
изменениях.
ъ Будьте особенно внимательны при кодировке сортирующих
программ. Пользуйтесь трассировкой для тестирования,
так как малейшая ошибка может привести к непредсказуе
мым результатам.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------
Ассемблер для IBM PC. Глава 14 34
14.1. Определите таблицу, которая содержит имена дней
недели, начиная с воскресения.
14.2 Предполагая, что воскресенье равно 1, напишите команды
прямого доступа к таблице, определенной в вопросе
14.1. используйте любые подходящие имена.
14.3 Определите три отдельных связанных таблицы, содержащих
следующие данные:
а) числовые элементы: 06, 10, 14, 21, 24;
б) элементы наименований: видеокассеты, приемники,
модемы, клавиатуры, дискеты;
в) цены: 93.95, 82.25, 90.67, 85.80, 13.85.
14.4 Составьте программу, позволяющую вводить числовой
элемент (ITEMIN) и количество (QTYIN) с клавиатуры.
Используя таблицу из вопроса 14.3, разработайте
программу табличного поиска элемента равного ITEMIN.
Выделите из таблиц наименование и цену. Рассчитайте
величину стоимости (Количество х Цена ) и выдайте на
экран наименование и стоимость.
14.5 Используя описание таблицы из вопроса 14.3, составьте
процедуры: а) пересылающую содержимое одной таблицы в
новую (пустую) таблицу; б) сортирующую содержимое
новой таблицы в восходящей последовательности.
Ассемблер для IBM PC. Глава 15 45
------------------------------------------------------------
Дисковая память I: Организация
Цель: Рассмотреть основные форматы записей в памяти на
твердом диске (винчестере) и на дискете, включая оглавление
и таблицу распределения файлов.
ВВЕДЕНИЕ
------------------------------------------------------------
Диск является распростроненным средством для более или
менее долговременного хранения данных. Процессы обработки
данных на твердом диске (винчестре) аналогичны процессам для
гибких дисков (дискет), за исключением того, что возможно
потребуется обеспечить пути для доступа к многочисленным
подоглавлениям винчестера. Для обработки файлов полезно
ознакомиться с организацией дисковой памяти. Каждая cторона
стандартной 5 1/4 дюймовой дискеты содержит 40 концентричес
ких дорожек, пронумерованных от 00 до 39. На каждой дорожке
форматируется восемь или девять секторов по 512 байтов
каждый.
Дданные записываются на диск в виде файлов, аналогично
тому, как вы записываете ассемблерные программы. Хотя на
типы данных, которые можно хранить в файле, не существует
каких-либо ограничений, типичный пользовательский файл
содержит списки заказчиков, описи товаров и предложений или
списки имен и адресов. Каждая запись содержит информацию о
конкретном заказчике или описание товара. Внутри файла все
записи имеют одинаковую длину и формат. Запись может
содержать oдно или несколько полей. Файл заказчиков,
например, может состоять из записей, в которые входит номер
заказчика, имя заказчика и долговой баланс. Эти записи могут
быть расположены в порядке возрастания номеров заказчиков
следующим образом:
+--+---+-----++--+---+-----++--+---+-----+ +--+---+-----+
|Э1|имя|сумма||Э2|имя|сумма||Э3|имя|сумма|...|Эn|имя|сумма|
+--+---+-----++--+---+-----++--+---+-----+ +--+---+-----+
Для программирования дисковых файлов следует в общих
чертах ознакомится только с концепцией и терминологией. Если
в данной главе размеры диска не указываются, то
предполагается диск 5 1/4" формата.
ЕМКОСТЬ ДИСКА
------------------------------------------------------------
Емкость гибких дисков:
Версия Число Число Число Всего
Ассемблер для IBM PC. Глава 15 46
дорожек секторов байтов в на двух
на стороне на дорожке секторе сторонах
До DOS 2.0 40 8 512 327 680
DOS 2.0 и после 40 9 512 368 640
Высокая плотность 80 15 512 1 228 800
3 1/2" 80 9 512 737 280
Емкость твердых дисков:
Версия Число Число Число Всего
дорожек секторов байтов в на 4-х
на стороне на дорожке секторе сторонах
10 мегабайт 306 17 512 10 653 696
20 мегабайт 614 17 512 21.377.024
Указание стороны (головки), дорожки или сектора на диске
осуществляется по номеру. Для стороны и дорожки отсчет
ведется с 0, а для сектора - с 1.
ОГЛАВЛЕНИЕ ДИСКА (КАТАЛОГ)
------------------------------------------------------------
Для того, чтобы организовать хранение информации на
диске, операционная система DOS резервируют определенные
сектора для своих нужд. Организация данных на дискете или
на твердом диске существенно зависит от их емкости. Формати
рованная двухстороняя дискета с девятью сектороми на дорожке
содержит следующую системную информацию:
Сторона Дорожка Сектор
0 0 1 Запись начальной загрузки
0 0 2-3 Таблица распределения файлов (FAT)
0 0 4-7 Каталог
1 0 1-3 Каталог
1 0 4 ... Файлы данных
Область записей данных начинается с третьего сектора на
1-й стороне 0-й дорожки и продолжается до девятого сектора.
Следующие записи заносятся на 0-ю сторону 1-й доpожки, затем
на 1-ю сторону 1-й дорожки, затем на 0-ю сторону 2-й дорожки
и т.д. Такая особенность заполнения дисковой памяти на
противоположных дорожках снижает число перемещений головки
дисковода. Данный метод используется как для гибких, так и
для твердых дисков.
При использовании утилиты FORMAT /S для форматизации
дискеты, модули DOS IBMBIO.COM и IBMDOS.COM записывается в
первые сектора области данных.
Ассемблер для IBM PC. Глава 15 47
Все файлы, даже меньшие 512 байт (или кратные 512),
начинаются на границе сектора. Для каждого файла DOS создает
на нулевой доpожке диска элемент оглавления. Каждый такой
элемент описывает имя, дату, размер и расположение файла на
диске. Элементы оглавления имеют следующий формат:
Байт Назначение
0-7 Имя файла, определяемое из программы, создавшей
данный файл. Первый байт может указывать на статус
файла: шест.00 обозначает, что данный файл не
используется, шест.E5 - файл удален, шест. 2E -
элемент подоглавления.
8-10 Тип файла
11 Атрибут файла, определяющий его тип:
шест.00 - обычный файл;
шест.01 - файл можно только читать;
шест.02 - "спрятанный" файл;
шест.04 - системный файл DOS;
шест.08 - метка тома;
шест.10 - подоглавление;
шест.20 - архивный файл (для твердого диска).
12-21 Зарезервировано для DOS.
22-23 Время дня, когда файл был создан или последний раз
изменялся, в следующим двоичном формате:
|чччччммммммссссс|
24-25 Дата создания или последнего изменения файла, сжатая
в два слова в следующем двоичном формате:
|гггггггм|мммддддд|
где год начинается с 1980 и может принимать значения
от 0 до 119, месяц - от 1 до 12, а день - от 1 до 31.
26-27 Начальный кластер файла. Относительный номер
последних двух секторов каталога. Первый файл данных
(без COM-модулей DOS) начинается на относительном
кластере 002. Текущая сторона, дорожка и кластер
зависят от емкости диска.
28-31 Размер файла в байтах. При создании файла DOS
вычисляет и записывает размер файла в это поле.
Все поля в каталоге диска, превышающие один байт,
записываются в обратной последовательности байтов.
ТАБЛИЦА РАСПРЕДЕЛЕНИЯ ФАЙЛОВ
------------------------------------------------------------
Назначение таблицы распределения файлов (FAT - File
Allocation Table) - распределение дискового пространства для
файлов. Если вы создаете новый файл или изменяете
существующий, то DOS меняет элементы таблицы файлов в
Ассемблер для IBM PC. Глава 15 48
соответствии с расположением файла на диске. Запись
начальной загрузки находится на секторе 1, далее на секторе
2 начинается FAT. FAT содержит элементы для каждого
кластера, длина элементов FAT зависит от устройства дисковой
памяти. Кластер для односторонних дискет представляет
собой один сектор, для двухсторонних дискет - смежную пару
секторов. Одно и то же число элементов в FAT определяет в
два pаза больше данных для двухсторонних дискет, чем для
одностронних.
Первые байты FAT определяют тип устройства:
FE Односторонняя на 8 секторов
FC Односторонняя на 9 секторов
FF Двухсторонняя на 8 секторов
FD Двухсторонняя на 9 секторов
F9 Повышенная емкость (1,2 мегабайта)
F8 Твердый диск
Второй и третий байты пока содержат FFFF. В следующей
таблице показана организация данных для нескольких типов
устройств (приведены начальные и конечные номера секторов).
Колонка "Кластер" представляет число секторов в кластере:
Устройство диска Запись FAT Каталог Кластер
нач.загр.
Односторонний, 8 секторов 1 2-3 4-7 1
Односторонний, 9 секторов 1 2-5 6-9 1
Двухсторонний, 8 секторов 1 2-3 4-10 2
Двухсторонний, 9 секторов 1 2-5 6-12 2
Повышенная емкость (1,2 М) 1 2-15 16-29 1
Твердый диск XT 1 2-17 18-49 8
Твердый диск AT 1 2-838 4-115 4
Начиная с четвертого байта, элементы FAT определяют
сектора. Каждый такой элемент имеет длину 12 битов. (В
версии DOS 3 и старше элементы FAT для твердого диска могут
иметь длину 16 битов). Два первых элемента FAT, известные
как относительные сектора 000 и 001, соответственно,
указывают на два последних сектора оглавления, определяя
его размер и формат. Первый файл данных начинается на
относительном секторе 002. Каждый элемент FAT состоит из
трех шест.цифр (12 битов), которые указывают на характер
использования конкретного сектора:
000 свободный кластер,
nnn относительный номер следующего кластера для файла,
FF7 неиспользуемый кластер (сбойная дорожка),
FFF последний кластер файла.
Предположим, например, что дискета содержит только один
файл с именем PAYROLL.ASM, занимающий относительные сектора
002, 003 и 004. Элемент оглавления для этого файла содержит
Ассемблер для IBM PC. Глава 15 49
имя файла PAYROLL, тип - ASM, шест.00 для обычного файла,
дату создания, 002 - номер первого относительного сектора
файла и размер файла в битах. Таблица FAT в этом случае
может выглядеть следующим образом (кроме того, что в каждой
паре байты в обратной последовательности):
Элемент FAT: |FDF|FFF|003|004|FFF|000|000|...|000|
Относительн.сектор: 0 1 2 3 4 5 6 ...конец
Первые два элемента FAT указывают расположение каталога
на относительных секторах 000 и 001. Для ввода
рассматриваемого файла в память, система выполняет следующие
действия:
1. DOS получает доступ к дискете и ищет в каталоге имя
PAYROLL и тип ASM.
2. Затем DOS определяет по каталогу положение первого
относительного сектора файла (002) и загружает содержи
мое этого сектора в буферную область в основной
памяти.
3. Номер второго сектора DOS получает из элемента FAT,
соответствующего относительному сектору 002. Из
диаграммы, приведенной выше, видно, что зтот элемент
содержит 003. Это обозначает, что файл продолжается в
относительном секторе 003. DOS загружает содержимое
этого сектора в буфер в основной памяти.
4. Номер третьего сектора DOS получает из элемента FAT,
соответствующего относительному сектору 003. Этот
элемент содержит 004, значит файл продолжается в
относительном секторе 004. DOS загружает срдержимое
этого сектора в буфер в основной памяти.
5. Элемент FAT для относительного сектора 004 содержит
шест.FFF, что свидетельствует о том, что больше нет
данных для этого файла.
Элемент каталога содержит номер начального кластера для
каждого файла, а FAT - шест.трехзначные элементы, указываю
щие на расположение каждого дополнительного кластера, если
он имеется. Для того, чтобы указать, например, что файл
содержит все записи только в первом кластере, таблица FAT
должна содержать шест.FFF в элементе, представляющем первый
относительный кластер.
В качестве простого примера рассмотрим элемент каталога,
указывающий, что некоторый файл начинается в относительном
кластере 15. Для локализации первого элемента таблицы FAT
необходимо:
ъ Умножить 15 на 1,5, получим 22,5.
ъ Выполнить выборку содержимого байтов 22 и 23 из FAT.
Прежположим, что они содержат F*FF.
ъ Переставить байты: FFF*.
Ассемблер для IBM PC. Глава 15 50
ъ Так как номер 15-нечетный, то первые три цифры - FFF
указывают на отсутствие других кластеров для данного
файла.
Теперь рассмотрим файл, который занимает четыре кластера,
начинающихся с номера 15. Таблица FAT, начиная с байта 22 и
далее, в этот pаз показана в правильной обратной
последовательности байтов в паpах:
6* 01 17 80 01 FF*F
Для того, чтобы найти первый элемент FAT, необходимо
умножить 15 на 1,5, получим 22,5, и выбрать содержимое
байтов 22 и 23, как в предыдущем примере. В этот раз эти
байты содержат 6*01, что после перестановки байт даст 016*.
Так как 15-число нечетное, то используются первые три цифры
016. Второй кластер для файла, следовательно, имеет номер
016.
Для того, чтобы найти третий кластер, необходимо умножить
16 на 1,5 получим 24. Затем следует выбрать содержимое
байтов 24 и 25 таблицы FAT. Значение 1780 после перестановки
байтов даст 8017. Так как число 16 четное, то используются
последние три цифры 017. Третий кластер для файла имеет
номер 017.
Для того, чтобы найти четвертый кластер, необходимо
умножить 17 на 1,5, получим 25.5. Затем следует выбрать
содержимое байтов 25 и 26 таблицы FAT. Значение 8001 после
перестановки байтов даст 0180. Так как число 17 нечетное, то
используются первые три цифры 018. Четвертый кластер для
файла имеет номер 018.
При использовании этой же процедуры для локализации
содержимого следующего элемента FAT по относительным адресам
27 и 28, получим FF*F, что после перестановки даст *FFF. Так
как число 18 четное, используются последние три цифры FFF,
что обозначает последний элемент.
Как было ранее сказано, все файлы начинаются на границе
кластеpа. Кроме того, совсем не обязательно файл должен
храниться в соседних кластерах, он может быть разбросан на
диске по разным секторам.
Если в программе необходимо определить тип установленного
диска, то можно обратиться к таблице FAT непосредственно,
или, что предпочтительней, использовать функцию DOS 1BH или
1CH.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------
ъ Независимо от размеров все файлы начинаются на границе
кластера.
ъ Оглавление (каталог) содержит для каждого файл на диске
элементы, определяющие имя, тип, атрибуты, дату, началь
ный сектор и pазмер файла.
Ассемблер для IBM PC. Глава 15 51
ъ Таблица распределения файлов (FAT) содержит один
элемент для каждого кластеpа в каждом файле.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------
15.1. Какую длину в байтах имеет стандартный сектор?
15.2. Где расположена запись начальной загрузки?
15.3. Как обозначаются в оглавлении удаленные файлы?
15.4. Какие дополнительные действия выполняются при формати
зации дискеты по команде DOS FORMAT /S?
15.5. Где и каким образом обозначается в таблице FAT, что
устройством является твердый диск?
15.6. Имеется файл размером 2890 (десятичное) байтов: а) Где
хранит cистема размер файла? б) Как выражается этот
размер в шестнадцатиричном формате? в) Покажите значе
ние в том виде, как оно записывается системой.
Ассемблер для IBM PC. Глава 16. 1
------------------------------------------------------------
Дисковая память II: Функции базовой версиии DOS
Цель: Раскрыть основные требования к программированию
функций базовой версии DOS для обработки дисковых файлов.
ВВЕДЕНИЕ
------------------------------------------------------------
В начале данной главы рассматриваются функции базовой
версии DOS, определяющие блок управления файлом (FCB), а
затем будут показаны возможности создания и обработки дис
ковых файлов последовательным и прямым доступом. Все рассмат
риваемые операции были введены в первых версиях DOS и возмож
ны во всех последующих версиях.
Обработка дисковых файлов в базовой DOS включает определе
ние блока управления файлом (FCB - file control block), кото
рый описывает файл и его записи. Передача адреса блока FCB
в DOS обязательна для всех дисковых операций ввода-вывода.
Новых команд ассемблера в данной главе не потребуется.
Управление вводом и выводом осуществляется специальными
прерываниями. Запись файла на диск требует, чтобы прежде он
был "создан" и DOS смогла сгенерировать соответствующий эле
мент в оглавлении. Когда все записи файла будут записаны,
программа должна "закрыть" файл, так, чтобы DOS завершила
обработку оглавления. Чтение файла требует, чтобы он был
сначала "открыт" для того, чтобы убедиться в его существо
вании. Так как записи имеют фиксированную длину и в силу
соответствующей организации оглавления, обработка записей
дискового файла может осуществляться как последовательно,
так и произвольно.
Метод доступа к дисковой памяти, поддерживающий использо
вание оглавления, "блокирование" и "разблокирование" запи
сей, обеспечивается прерыванием DOS 21H. Более низкий уро
вень, обеспечивающий абсолютную адресацию дисковых секторов,
также через DOS, выполняется посредством прерываний 25H и
26H. Самый низкий уровень обеспечивается прерыванием BIOS
13H, которое позволяет выполнить произвольную адресацию в
дисковой памяти по номеру дорожки и сектора. Методы DOS осу
ществляют некоторую предварительную обработку до передачи
Команда XLAT предполагает адрес таблицы в регистре BX, а
транслируемый байт (например, поля ASCNO) в регистре AL.
Следующие команды выполняют подготовку и трансляцию байта:
LEA BX,XLTBL
MOV AL,ASCNO
XLAT
Команда XLAT использует значение в регистре AL в качестве
относительного aдреса в таблице, т.е. складывает адрес в BX
и смещение в AL. Если, например, ASCNO содержит 00, то адрес
байта в таблице будет XLTBL+00 и команда XLAT заменит 00 на
шест.40 из таблицы. Если поле ASCNO cодержит шест.32, то
адрес соответствующего байта в таблице будет XLTBL+50. Этот
байт содержит шест.F2 (2 в коде EBCDIC), который команда
XLAT загружает в регистр AL.
------------------------------------------------------------
------------------------------------------------------------
Рис.14.4. Преобразование ASCII в EBCDIC.
В программе на рис.14.4 добавлено преобразование
десятичной точки (2E) и знака минус (2D) из кода ASCII в код
EBCDIC (4B и 60 соответственно). В программе организован
цикл для обработки шестибайтового поля. Поле ASCNO в начале
выполнения программы содержит значение 31.5 с последующим
пробелом, или шест.2D33312E3520. В конце выполнения програм
мы в поле EBCNO должно быть шест. 60F3F14BF540.
ПРОГРАММА: ОТОБРАЖЕНИЕ ШЕСТ. И ASCII-КОДОВ
------------------------------------------------------------
Программа, приведенная на рис.14.5, отображает на экране
почти все ASCII-символы, а также их шест.значения. Например,
ASCII-символ для шест.53 - это буква S, эти данные программа
выводит в виде 53 S. Полное изображение на экране выглядит в
виде матрицы 16х16:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
------------------------------------------------------------
Ассемблер для IBM PC. Глава 14 31
------------------------------------------------------------
Рис.14.5. Отображение шест. и ASCII-кодов
Как было показано еще на рис.8.1, отображение ASCII-
символов, oсобых проблем не вызывает. Что же касается
отображения шест.значений в символах ASCII, то этот процесс
более сложный. Например, для вывода на экран в коде ASCII
шест. 00, 01 и т.д. необходимо преобразовать шест.00 в шест.
3030, шест.01 в шест.3031 и т.д.
В программе начальное значение поля HEXCTR равно 00. Это
значение последовательно увеличивается на 1. Процедура
C10HEX расщепляет байт HEXCTR на две щест.цифры.
Предположим, что байт HEXCTR содержит шест. 4F. Процедура
сначала выделяет шест.цифру 4 и использует это значение для
перекодировки по таблице XLATAB. В регистре AL устанавливает
ся в результате значение шест.34. Затем процедура выделяет
вторую шест.цифру F и перекодирует ее в шест.46. В
результате oбработки получается шест.3446, что отображается
на экране как 4F.
Так как функция DOS для вывода на экран (шест.40)
рассматривает шест.1A как конец файла, то в программе
это значение заменяется на пробел. Программа, использующая
для вывода на экран функцию DOS (шест.09), дожна заменять
символ ограничитель '$' на пробел.
Существует много различных способов преобразования
шест.цифр в ASCII-символы. Можно поэкспериментировать с
операциями сдвига и сравнения.
ПРОГРАММА: СОРТИРОВКА ЭЛЕМЕНТОВ ТАБЛИЦЫ
------------------------------------------------------------
Часто возникает необходимость сортировки элементов
таблицы в восходящем или нисходящем порядке. Например,
пользователю может потребоваться список наименований
товара в алфавитном порядке или список общих цен в
нисходящей последовательности. Обычно, табличные данные не
определяются как в предыдущей программе, а загружаются с
клавиатуры или с диска. Данный раздел посвящен сортировке
элементов таблицы, что касается различных применений,
включающих сортировку записей на дисках, то здесь возможны
более сложные программы.
Существует несколько алгоритмов сортировки таблиц от
неэффективных, но понятных, до эффективных и непонятных.
Программа сортировки, предлагаемая в данном разделе, весьма
эффективна и может применяться для большенства табличных
сортировок. Конечно, если не проверить различные алгоритмы
сортировок, то даже самая неэффективная программа может
показаться работающей со скоростью света. Но цель данной
книги - показать технику ассемблера, а не сортировки.
Основной подход заключается в сравнении соседних элементов
таблицы. Если первый элемент больше второго, то элементы
меняются местами. Таким образом выполняется сравнение
элементов 1 со 2, 2 с 3 и т.д. до конца таблицы с
Ассемблер для IBM PC. Глава 14 32
перестановкой элементов там, где это необходимо. Если в
проходе были сделаны перестановки, то весь процесс повторяет
ся с начала таблицы т.е. сравниваются снова элементы 1-2,
2-3 и т.д. Если в проходе не было перестановок, то таблица
отсортирована и можно прекратить процесс.
Ниже приведен алгоритм, в котором переменная SWAP
является индикатором: была перестановка элементов (YES) или
нет (NO):
G10: Определить адрес последнего элемента
G20: Установить SWAP=NO
Определить адрес первого элемента
G30: Элемент > следующего элемента?
Да: Представить элементы
Установить SWAP=YES
Перейти к следующему элементу
Конец таблицы?
Нет: Перейти на G30
Да: SWAP=YES?
Да: Перейти на G20 (повторить сорт.)
Нет: Конец сортировки
Программа, показанная на рис.14.6, обеспечивает ввод с
клавиатуры до 30 имен, сортировку введенных имен в алфавит
ном порядке и вывод на экран отсортированного списка имен.
------------------------------------------------------------
------------------------------------------------------------
Рис.14.6. Сортировка таблицы имен.
ОПЕРАТОРЫ ТИПА, ДЛИНА И РАЗМЕРА
------------------------------------------------------------
Ассемблер содержит ряд специальных операторов, которые
могут оказаться полезными при программировании. Например,
при изменении длины таблицы придется модифицировать
программу (для нового определения таблицы) и процедуры,
проверяющие конец таблицы. В этом случае использование
операторов TYPE (тип), LENGTH (длина) и SIZE (размер)
позволяют уменьшить число модифицируемых команд.
Рассмотрим определение следующей таблицы из десяти слов:
TABLEX DW 10 DUP(?) ;Таблица из 10 слов
Программа может использовать оператор TYPE для определения
типа (DW в данном случае), оператор LENGTH для определения
DUP-фактора (10) и оператор SIZE для определения числа
байтов (10 х 2 = 20). Следующие команды иллюстрируют три
таких применения:
MOV AX,TYPE TABLEX ;AX=0002
MOV BX,LENGTH TABLEX ;BX=000A (10)
MOV CX,SIZE TABLEX ;CX=0014 (20)
Ассемблер для IBM PC. Глава 14 33
Значения LENGTH и SIZE можно использлвать для окончания
табличного поиска или сортировки. Например, если регистр SI
содержит продвинутый адрес таблицы при осуществлении поиска,
то проверка на конец таблицы может быть следующий:
CMP SI,SIZE TABLEX
В главе 23 "Справочник по директивам ассемблера" дается
детальное описание операторов TYPE, LENGTH и SIZE.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------
ъ Для большинства применений, определяйте таблицы,
имеющие родственные элементы одной длины и формата
данных.
ъ Стройте таблицы на основе форматов данных. Например,
элементы могут быть символьные или числовые длиной
один, два и более байтов каждый. Может оказаться более
практичным определение двух таблиц: одна, например, для
трехсимвольных значений номеpов, а другая для
двухбайтовых значений цен единиц товара. В процессе
поиска адрес элементов таблицы номеров должен увеличи
ваться на 3, а адрес элементов таблицы цен - на 2. Если
сохранить число выполненных циклов при поиске на равно,
то, умножив это число на 2 (SHL сдвиг влево на один
бит), получим относительный адрес искомого значения
цены. (Начальное значение счетчика циклов должно быть
равно -1).
ъ Помните, что DB позволяет определять значения, не
превышающие 256, а DW записывает байты в обратной
последовательности. Команды CMP и CMPSW предполагают,
что байты в сравниваемых словах имеют обратную
последовательность.
ъ Если таблица подвергается частым изменениям, или должна
быть доступна нескольким программам, то запишите ее на
диск. Для внесения изменений в таблицу можно
разработать специальную программу модификации. Любые
программы могут загружать таблицу с диска и при
обновлениях таблицы сами программы не нуждаются в
изменениях.
ъ Будьте особенно внимательны при кодировке сортирующих
программ. Пользуйтесь трассировкой для тестирования,
так как малейшая ошибка может привести к непредсказуе
мым результатам.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------
Ассемблер для IBM PC. Глава 14 34
14.1. Определите таблицу, которая содержит имена дней
недели, начиная с воскресения.
14.2 Предполагая, что воскресенье равно 1, напишите команды
прямого доступа к таблице, определенной в вопросе
14.1. используйте любые подходящие имена.
14.3 Определите три отдельных связанных таблицы, содержащих
следующие данные:
а) числовые элементы: 06, 10, 14, 21, 24;
б) элементы наименований: видеокассеты, приемники,
модемы, клавиатуры, дискеты;
в) цены: 93.95, 82.25, 90.67, 85.80, 13.85.
14.4 Составьте программу, позволяющую вводить числовой
элемент (ITEMIN) и количество (QTYIN) с клавиатуры.
Используя таблицу из вопроса 14.3, разработайте
программу табличного поиска элемента равного ITEMIN.
Выделите из таблиц наименование и цену. Рассчитайте
величину стоимости (Количество х Цена ) и выдайте на
экран наименование и стоимость.
14.5 Используя описание таблицы из вопроса 14.3, составьте
процедуры: а) пересылающую содержимое одной таблицы в
новую (пустую) таблицу; б) сортирующую содержимое
новой таблицы в восходящей последовательности.
Ассемблер для IBM PC. Глава 15 45
------------------------------------------------------------
Дисковая память I: Организация
Цель: Рассмотреть основные форматы записей в памяти на
твердом диске (винчестере) и на дискете, включая оглавление
и таблицу распределения файлов.
ВВЕДЕНИЕ
------------------------------------------------------------
Диск является распростроненным средством для более или
менее долговременного хранения данных. Процессы обработки
данных на твердом диске (винчестре) аналогичны процессам для
гибких дисков (дискет), за исключением того, что возможно
потребуется обеспечить пути для доступа к многочисленным
подоглавлениям винчестера. Для обработки файлов полезно
ознакомиться с организацией дисковой памяти. Каждая cторона
стандартной 5 1/4 дюймовой дискеты содержит 40 концентричес
ких дорожек, пронумерованных от 00 до 39. На каждой дорожке
форматируется восемь или девять секторов по 512 байтов
каждый.
Дданные записываются на диск в виде файлов, аналогично
тому, как вы записываете ассемблерные программы. Хотя на
типы данных, которые можно хранить в файле, не существует
каких-либо ограничений, типичный пользовательский файл
содержит списки заказчиков, описи товаров и предложений или
списки имен и адресов. Каждая запись содержит информацию о
конкретном заказчике или описание товара. Внутри файла все
записи имеют одинаковую длину и формат. Запись может
содержать oдно или несколько полей. Файл заказчиков,
например, может состоять из записей, в которые входит номер
заказчика, имя заказчика и долговой баланс. Эти записи могут
быть расположены в порядке возрастания номеров заказчиков
следующим образом:
+--+---+-----++--+---+-----++--+---+-----+ +--+---+-----+
|Э1|имя|сумма||Э2|имя|сумма||Э3|имя|сумма|...|Эn|имя|сумма|
+--+---+-----++--+---+-----++--+---+-----+ +--+---+-----+
Для программирования дисковых файлов следует в общих
чертах ознакомится только с концепцией и терминологией. Если
в данной главе размеры диска не указываются, то
предполагается диск 5 1/4" формата.
ЕМКОСТЬ ДИСКА
------------------------------------------------------------
Емкость гибких дисков:
Версия Число Число Число Всего
Ассемблер для IBM PC. Глава 15 46
дорожек секторов байтов в на двух
на стороне на дорожке секторе сторонах
До DOS 2.0 40 8 512 327 680
DOS 2.0 и после 40 9 512 368 640
Высокая плотность 80 15 512 1 228 800
3 1/2" 80 9 512 737 280
Емкость твердых дисков:
Версия Число Число Число Всего
дорожек секторов байтов в на 4-х
на стороне на дорожке секторе сторонах
10 мегабайт 306 17 512 10 653 696
20 мегабайт 614 17 512 21.377.024
Указание стороны (головки), дорожки или сектора на диске
осуществляется по номеру. Для стороны и дорожки отсчет
ведется с 0, а для сектора - с 1.
ОГЛАВЛЕНИЕ ДИСКА (КАТАЛОГ)
------------------------------------------------------------
Для того, чтобы организовать хранение информации на
диске, операционная система DOS резервируют определенные
сектора для своих нужд. Организация данных на дискете или
на твердом диске существенно зависит от их емкости. Формати
рованная двухстороняя дискета с девятью сектороми на дорожке
содержит следующую системную информацию:
Сторона Дорожка Сектор
0 0 1 Запись начальной загрузки
0 0 2-3 Таблица распределения файлов (FAT)
0 0 4-7 Каталог
1 0 1-3 Каталог
1 0 4 ... Файлы данных
Область записей данных начинается с третьего сектора на
1-й стороне 0-й дорожки и продолжается до девятого сектора.
Следующие записи заносятся на 0-ю сторону 1-й доpожки, затем
на 1-ю сторону 1-й дорожки, затем на 0-ю сторону 2-й дорожки
и т.д. Такая особенность заполнения дисковой памяти на
противоположных дорожках снижает число перемещений головки
дисковода. Данный метод используется как для гибких, так и
для твердых дисков.
При использовании утилиты FORMAT /S для форматизации
дискеты, модули DOS IBMBIO.COM и IBMDOS.COM записывается в
первые сектора области данных.
Ассемблер для IBM PC. Глава 15 47
Все файлы, даже меньшие 512 байт (или кратные 512),
начинаются на границе сектора. Для каждого файла DOS создает
на нулевой доpожке диска элемент оглавления. Каждый такой
элемент описывает имя, дату, размер и расположение файла на
диске. Элементы оглавления имеют следующий формат:
Байт Назначение
0-7 Имя файла, определяемое из программы, создавшей
данный файл. Первый байт может указывать на статус
файла: шест.00 обозначает, что данный файл не
используется, шест.E5 - файл удален, шест. 2E -
элемент подоглавления.
8-10 Тип файла
11 Атрибут файла, определяющий его тип:
шест.00 - обычный файл;
шест.01 - файл можно только читать;
шест.02 - "спрятанный" файл;
шест.04 - системный файл DOS;
шест.08 - метка тома;
шест.10 - подоглавление;
шест.20 - архивный файл (для твердого диска).
12-21 Зарезервировано для DOS.
22-23 Время дня, когда файл был создан или последний раз
изменялся, в следующим двоичном формате:
|чччччммммммссссс|
24-25 Дата создания или последнего изменения файла, сжатая
в два слова в следующем двоичном формате:
|гггггггм|мммддддд|
где год начинается с 1980 и может принимать значения
от 0 до 119, месяц - от 1 до 12, а день - от 1 до 31.
26-27 Начальный кластер файла. Относительный номер
последних двух секторов каталога. Первый файл данных
(без COM-модулей DOS) начинается на относительном
кластере 002. Текущая сторона, дорожка и кластер
зависят от емкости диска.
28-31 Размер файла в байтах. При создании файла DOS
вычисляет и записывает размер файла в это поле.
Все поля в каталоге диска, превышающие один байт,
записываются в обратной последовательности байтов.
ТАБЛИЦА РАСПРЕДЕЛЕНИЯ ФАЙЛОВ
------------------------------------------------------------
Назначение таблицы распределения файлов (FAT - File
Allocation Table) - распределение дискового пространства для
файлов. Если вы создаете новый файл или изменяете
существующий, то DOS меняет элементы таблицы файлов в
Ассемблер для IBM PC. Глава 15 48
соответствии с расположением файла на диске. Запись
начальной загрузки находится на секторе 1, далее на секторе
2 начинается FAT. FAT содержит элементы для каждого
кластера, длина элементов FAT зависит от устройства дисковой
памяти. Кластер для односторонних дискет представляет
собой один сектор, для двухсторонних дискет - смежную пару
секторов. Одно и то же число элементов в FAT определяет в
два pаза больше данных для двухсторонних дискет, чем для
одностронних.
Первые байты FAT определяют тип устройства:
FE Односторонняя на 8 секторов
FC Односторонняя на 9 секторов
FF Двухсторонняя на 8 секторов
FD Двухсторонняя на 9 секторов
F9 Повышенная емкость (1,2 мегабайта)
F8 Твердый диск
Второй и третий байты пока содержат FFFF. В следующей
таблице показана организация данных для нескольких типов
устройств (приведены начальные и конечные номера секторов).
Колонка "Кластер" представляет число секторов в кластере:
Устройство диска Запись FAT Каталог Кластер
нач.загр.
Односторонний, 8 секторов 1 2-3 4-7 1
Односторонний, 9 секторов 1 2-5 6-9 1
Двухсторонний, 8 секторов 1 2-3 4-10 2
Двухсторонний, 9 секторов 1 2-5 6-12 2
Повышенная емкость (1,2 М) 1 2-15 16-29 1
Твердый диск XT 1 2-17 18-49 8
Твердый диск AT 1 2-838 4-115 4
Начиная с четвертого байта, элементы FAT определяют
сектора. Каждый такой элемент имеет длину 12 битов. (В
версии DOS 3 и старше элементы FAT для твердого диска могут
иметь длину 16 битов). Два первых элемента FAT, известные
как относительные сектора 000 и 001, соответственно,
указывают на два последних сектора оглавления, определяя
его размер и формат. Первый файл данных начинается на
относительном секторе 002. Каждый элемент FAT состоит из
трех шест.цифр (12 битов), которые указывают на характер
использования конкретного сектора:
000 свободный кластер,
nnn относительный номер следующего кластера для файла,
FF7 неиспользуемый кластер (сбойная дорожка),
FFF последний кластер файла.
Предположим, например, что дискета содержит только один
файл с именем PAYROLL.ASM, занимающий относительные сектора
002, 003 и 004. Элемент оглавления для этого файла содержит
Ассемблер для IBM PC. Глава 15 49
имя файла PAYROLL, тип - ASM, шест.00 для обычного файла,
дату создания, 002 - номер первого относительного сектора
файла и размер файла в битах. Таблица FAT в этом случае
может выглядеть следующим образом (кроме того, что в каждой
паре байты в обратной последовательности):
Элемент FAT: |FDF|FFF|003|004|FFF|000|000|...|000|
Относительн.сектор: 0 1 2 3 4 5 6 ...конец
Первые два элемента FAT указывают расположение каталога
на относительных секторах 000 и 001. Для ввода
рассматриваемого файла в память, система выполняет следующие
действия:
1. DOS получает доступ к дискете и ищет в каталоге имя
PAYROLL и тип ASM.
2. Затем DOS определяет по каталогу положение первого
относительного сектора файла (002) и загружает содержи
мое этого сектора в буферную область в основной
памяти.
3. Номер второго сектора DOS получает из элемента FAT,
соответствующего относительному сектору 002. Из
диаграммы, приведенной выше, видно, что зтот элемент
содержит 003. Это обозначает, что файл продолжается в
относительном секторе 003. DOS загружает содержимое
этого сектора в буфер в основной памяти.
4. Номер третьего сектора DOS получает из элемента FAT,
соответствующего относительному сектору 003. Этот
элемент содержит 004, значит файл продолжается в
относительном секторе 004. DOS загружает срдержимое
этого сектора в буфер в основной памяти.
5. Элемент FAT для относительного сектора 004 содержит
шест.FFF, что свидетельствует о том, что больше нет
данных для этого файла.
Элемент каталога содержит номер начального кластера для
каждого файла, а FAT - шест.трехзначные элементы, указываю
щие на расположение каждого дополнительного кластера, если
он имеется. Для того, чтобы указать, например, что файл
содержит все записи только в первом кластере, таблица FAT
должна содержать шест.FFF в элементе, представляющем первый
относительный кластер.
В качестве простого примера рассмотрим элемент каталога,
указывающий, что некоторый файл начинается в относительном
кластере 15. Для локализации первого элемента таблицы FAT
необходимо:
ъ Умножить 15 на 1,5, получим 22,5.
ъ Выполнить выборку содержимого байтов 22 и 23 из FAT.
Прежположим, что они содержат F*FF.
ъ Переставить байты: FFF*.
Ассемблер для IBM PC. Глава 15 50
ъ Так как номер 15-нечетный, то первые три цифры - FFF
указывают на отсутствие других кластеров для данного
файла.
Теперь рассмотрим файл, который занимает четыре кластера,
начинающихся с номера 15. Таблица FAT, начиная с байта 22 и
далее, в этот pаз показана в правильной обратной
последовательности байтов в паpах:
6* 01 17 80 01 FF*F
Для того, чтобы найти первый элемент FAT, необходимо
умножить 15 на 1,5, получим 22,5, и выбрать содержимое
байтов 22 и 23, как в предыдущем примере. В этот раз эти
байты содержат 6*01, что после перестановки байт даст 016*.
Так как 15-число нечетное, то используются первые три цифры
016. Второй кластер для файла, следовательно, имеет номер
016.
Для того, чтобы найти третий кластер, необходимо умножить
16 на 1,5 получим 24. Затем следует выбрать содержимое
байтов 24 и 25 таблицы FAT. Значение 1780 после перестановки
байтов даст 8017. Так как число 16 четное, то используются
последние три цифры 017. Третий кластер для файла имеет
номер 017.
Для того, чтобы найти четвертый кластер, необходимо
умножить 17 на 1,5, получим 25.5. Затем следует выбрать
содержимое байтов 25 и 26 таблицы FAT. Значение 8001 после
перестановки байтов даст 0180. Так как число 17 нечетное, то
используются первые три цифры 018. Четвертый кластер для
файла имеет номер 018.
При использовании этой же процедуры для локализации
содержимого следующего элемента FAT по относительным адресам
27 и 28, получим FF*F, что после перестановки даст *FFF. Так
как число 18 четное, используются последние три цифры FFF,
что обозначает последний элемент.
Как было ранее сказано, все файлы начинаются на границе
кластеpа. Кроме того, совсем не обязательно файл должен
храниться в соседних кластерах, он может быть разбросан на
диске по разным секторам.
Если в программе необходимо определить тип установленного
диска, то можно обратиться к таблице FAT непосредственно,
или, что предпочтительней, использовать функцию DOS 1BH или
1CH.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------
ъ Независимо от размеров все файлы начинаются на границе
кластера.
ъ Оглавление (каталог) содержит для каждого файл на диске
элементы, определяющие имя, тип, атрибуты, дату, началь
ный сектор и pазмер файла.
Ассемблер для IBM PC. Глава 15 51
ъ Таблица распределения файлов (FAT) содержит один
элемент для каждого кластеpа в каждом файле.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------
15.1. Какую длину в байтах имеет стандартный сектор?
15.2. Где расположена запись начальной загрузки?
15.3. Как обозначаются в оглавлении удаленные файлы?
15.4. Какие дополнительные действия выполняются при формати
зации дискеты по команде DOS FORMAT /S?
15.5. Где и каким образом обозначается в таблице FAT, что
устройством является твердый диск?
15.6. Имеется файл размером 2890 (десятичное) байтов: а) Где
хранит cистема размер файла? б) Как выражается этот
размер в шестнадцатиричном формате? в) Покажите значе
ние в том виде, как оно записывается системой.
Ассемблер для IBM PC. Глава 16. 1
------------------------------------------------------------
Дисковая память II: Функции базовой версиии DOS
Цель: Раскрыть основные требования к программированию
функций базовой версии DOS для обработки дисковых файлов.
ВВЕДЕНИЕ
------------------------------------------------------------
В начале данной главы рассматриваются функции базовой
версии DOS, определяющие блок управления файлом (FCB), а
затем будут показаны возможности создания и обработки дис
ковых файлов последовательным и прямым доступом. Все рассмат
риваемые операции были введены в первых версиях DOS и возмож
ны во всех последующих версиях.
Обработка дисковых файлов в базовой DOS включает определе
ние блока управления файлом (FCB - file control block), кото
рый описывает файл и его записи. Передача адреса блока FCB
в DOS обязательна для всех дисковых операций ввода-вывода.
Новых команд ассемблера в данной главе не потребуется.
Управление вводом и выводом осуществляется специальными
прерываниями. Запись файла на диск требует, чтобы прежде он
был "создан" и DOS смогла сгенерировать соответствующий эле
мент в оглавлении. Когда все записи файла будут записаны,
программа должна "закрыть" файл, так, чтобы DOS завершила
обработку оглавления. Чтение файла требует, чтобы он был
сначала "открыт" для того, чтобы убедиться в его существо
вании. Так как записи имеют фиксированную длину и в силу
соответствующей организации оглавления, обработка записей
дискового файла может осуществляться как последовательно,
так и произвольно.
Метод доступа к дисковой памяти, поддерживающий использо
вание оглавления, "блокирование" и "разблокирование" запи
сей, обеспечивается прерыванием DOS 21H. Более низкий уро
вень, обеспечивающий абсолютную адресацию дисковых секторов,
также через DOS, выполняется посредством прерываний 25H и
26H. Самый низкий уровень обеспечивается прерыванием BIOS
13H, которое позволяет выполнить произвольную адресацию в
дисковой памяти по номеру дорожки и сектора. Методы DOS осу
ществляют некоторую предварительную обработку до передачи