ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


ГЛАВА 16. Дисковая память II: Функции базовой версиии DOS

------------------------------------------------------------Дисковая память II: Функции базовой версиии DOS Цель: Раскрыть основные требования к программированиюфункций базовой версии DOS для обработки дисковых файлов. ВВЕДЕНИЕ------------------------------------------------------------ В начале данной главы рассматриваются функции базовойверсии DOS, определяющие блок управления файлом (FCB), азатем будут показаны возможности создания и обработки дисковых файлов последовательным и прямым доступом. Все рассматриваемые операции были введены в первых версиях DOS и возможны во всех последующих версиях. Обработка дисковых файлов в базовой DOS включает определение блока управления файлом (FCB - file control block), который описывает файл и его записи. Передача адреса блока FCBв DOS обязательна для всех дисковых операций ввода-вывода.Новых команд ассемблера в данной главе не потребуется. Управление вводом и выводом осуществляется специальнымипрерываниями. Запись файла на диск требует, чтобы прежде онбыл "создан" и DOS смогла сгенерировать соответствующий элемент в оглавлении. Когда все записи файла будут записаны,программа должна "закрыть" файл, так, чтобы DOS завершилаобработку оглавления. Чтение файла требует, чтобы он былсначала "открыт" для того, чтобы убедиться в его существовании. Так как записи имеют фиксированную длину и в силусоответствующей организации оглавления, обработка записейдискового файла может осуществляться как последовательно,так и произвольно. Метод доступа к дисковой памяти, поддерживающий использование оглавления, "блокирование" и "разблокирование" записей, обеспечивается прерыванием DOS 21H. Более низкий уровень, обеспечивающий абсолютную адресацию дисковых секторов,также через DOS, выполняется посредством прерываний 25H и26H. Самый низкий уровень обеспечивается прерыванием BIOS13H, которое позволяет выполнить произвольную адресацию вдисковой памяти по номеру дорожки и сектора. Методы DOS осуществляют некоторую предварительную обработку до передачиуправления в BIOS. В главе 17 объясняется применение предпочтительных функций расширенного DOS 2, а глава 18 представляет основные дисковые операции в BIOS. Напоминание:Термин кластер определяет один или более секторов с даннымив зависимости от дискового устройства. БЛОК УПРАВЛЕНИЯ ФАЙЛОМ (FCB)------------------------------------------------------------ Для выполнения операций ввода-вывода на диске в базовойDOS необходимо в области данных определить блок FCB. БлокFCB не поддерживает путь доступа к файлу, поэтому он используется главным образом для обработки файлов в текущей дирек Ассемблер для IBM PC. Глава 16. 2 тории. Блок FCB содержит описание файла и его записей вприведенном ниже формате. Пользователь должен инициализировать байты 0-15 и 32-36, байты 16-31 устанавливается DOS. Байты Назначение0 Указывает дисковод: 01 для дисковода A, 02 для B и т.д.1-8 Имя файла, выравненное по левой границе с конечными пробелами, если имя меньше 8 байт. Поле может содержать зарезервированные имена, например, LPT1 для принтера.9-11 Тип файла для дополнительной идентификации, например, DTA или ASM. Если тип файла меньше трех байт, то он должен быть выравнен по левой границе и дополнен конечными пробелами. DOS хранит имя и тип файла в оглавлении.12-13 Номер текущего блока. Блок содержит 128 записей. Для локализации конкретной записи используется номер текущего блока и номер текущей записи (байт 32). Первый блок файла имеет номер 0, второй - 1 и т.д. Операция открытия файла устанавливает в данном поле 0.14-15 Логический размер записи. Операция открытия инициа лизирует размер записи значением 128 (шест.80). После открытия и перед любой операцией чтения или записи можно устанавливать в данном поле любое тре буемое значение длины записи.16-19 Размер файла. При создании файла DOS вычисляет и записывает это значение (произведение числа запи сей на размер записей) в оглавление. Операция открытия выбирает размер файла из оглавления и заносит его в данное поле. Программа может читать это поле, но не может менять его.20-21 Дата. При создании или последней модификации файла DOS записывает дату в оглавление. Операция открытия выбирает дату из оглавления и заносит в данное поле.22-31 Зарезервировано для DOS.32 Текущий номер записи. Данное поле содержит текущий номер записи (О-127) в текущем блоке (см.байты 12-13). Система использует текущие значения блока и записи для локализации записи в дисковом файле. Обычно номер начальной записи в данном поле - 0, но его можно заменить для начала последовательной обработки на любое значение от 0 до 127.33-36 Относительный номер записи. Для произвольного дос тупа при операциях чтения или записи данное поле должно содержать относительный номер записи. Напри мер, для произвольного чтения записи номер 25 (шест.19), необходимо установить в данном поле шест 19000000. Произвольный доступ характеризует ся тем, что система автоматически преобразует относительный номер записи в текущие значения Ассемблер для IBM PC. Глава 16. 3 блока и записи. Ввиду ограничения на максимальный размер файла (1.073.741.824 байтов), файл с короткими записями может содержать больше записей и иметь больший относительный номер записи. Если размер записи больше 64, то байт 36 всегда содер жит 00. Помните, что числовые значения в словах и двойных словахзаписываются в обратной последовательности байтов. Блоку FCB предшествует необязательное семибайтовое расширение, которое можно использовать для обработки файлов соспециальными атрибутами. Для использования расширения необходимо закодировать в первом байте шест.FF, во втором - атрибут файла, а в остальных пяти байтах шесь.нули. ИСПОЛЬЗОВАНИЕ БЛОКА FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ------------------------------------------------------------ Для ссылки на каждый дисковый файл программа должна содержать правильно составленный блок управления файлом. Операцииввода-вывода на диск требуют установки адреса блока FCB врегистре DX. Доступ к полям блока FCB осуществляются поэтому адресу с помощью регистровой пары DS:DX. Для созданиянового файла программа использует функцию шест.16 в прерывании DOS INT 21H следующим образом: MOV AH,16H ; Создание LEA DX,FCBname ; дискового файла INT 21H ; Вызов DOS DOS осуществляет поиск имени файла и тип файла, взятогоиз соответствующих полей FCB, в оглавлении. Если элементоглавления, содержащий необходимое имя (и тип), будетнайдено, то DOS очищает найденный элемент для нового использования, если такой элемент не будет найден, то DOS ищетсвободный элемент. Затем операция устанавливает размер файлав 0 и "открывает" файл. На этапе открытия происходитпроверка доступного дискового пространства, результат такойпроверки устанавливается в регистре AL: 00 На диске есть свободное пространство FF На диске нет свободного пространства. При открытии также устанавливается в блок FCB номертекущего блока - 0 и размер записей (по умолчанию) - 128(шест.80) байтов. Прежде, чем начать запись файла, можнозаменить это значение по умолчанию на требуемый размерзаписей. Для определения выводной записи необходимо прежде обеспечить начальный адрес этой записи в область передачи данных(DTA - disk trausfer area). Так как блок FCB содержит размерзаписей, то в DTA не требуется устанавливать ограничительконца записи. Затем с помощью функции шест.1A необходимо Ассемблер для IBM PC. Глава 16. 4 сообщить DOS адрес DTA. В любой момент времени может бытьактивен только один DTA. В следующем примере инициализируется адрес DTA: MOV AH,1AH ; Установка адреса LEA DX,DTAname ; DTA INT 21H ; Вызов DOS Если программа обрабатывает только один дисковой файл, тодолжна быть только одна установка адреса DTA для всеговыполнения. При обработке нескольких файлов программа должнаустанавливать соответствующий адрес DTA непосредственноперед каждой операцией чтения или записи. Для последовательной записи на диск существует функцияшест. 15: MOV AH,15 ; Последовательная LEA DX,FCBname ; запись INT 21H ; Вызов DOS Операция записи использует информацию из блока FCB иадрес текущего буфера DTA. Если длина записи равна размерусектора, то запись заносится на диск. В противном случаезаписи заполняют буфер по длине сектора и затем буфер записывается на диск. Например, если длина каждой записи составляет 128 байтов, то буфер заполняется четырьмя записями(4*128=512) и затем буфер записывается в дисковой сектор. После успешного занесения записи на диск DOS увеличиваетв блоке FCB размер файла на размер записи и текущий номерзаписи на 1. Когда номер текущей записи достигает 128, происходит сброс этого значения в 0 и в FCB увеличивается номертекущего блока на 1. Операция возвращает в регистре AL следующие коды: 00 Успешная запись. 01 Диск полный. 02 В области DTA нет места для одной записи. Когда запись файла завершена, можно, хотя и не всегдаобязательно, записать маркер конца файла (шест.1A). Для закрытия файла используется функция шест.10: MOV AH,10H ; Закрыть LEA DX,FCBname ; файл INT 21H ; Вызов DOS Эта операция записывает на диск данные, которые ещеостались в дисковом буфере DOS и изменяет в соответствующемэлементе оглавления, дату и размер файла. В регистре ALвозвращаются следующие значения: 00 Успешная запись. FF Описание файла оказалось в неправильном Ассемблер для IBM PC. Глава 16. 5 элементе оглавления (возможно в результате смены дискеты). ПРОГРАММА: ИСПОЛЬЗОВАНИЕ FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ------------------------------------------------------------ Программа, приведенная на рис.16.1, создает дисковый файлпо имени, которое вводится пользователем с клавиатуры. БлокFCB (FCBREC) в данной программе содержит следующие поля: FCBDRIV Программа должна создать файл на диске в дисководе 4 (или D).FCBNAME Имя файла - NAMEFILE.FCBEXT Тип файла - DAT.FCBBLK Начальное значение номера текущего блока - 0.FCBRCSZ Размер записей неопределен, так как операция откры тия устанавливает в данном поле значение 128.FCBSQRC Начальное значение номера текущей записи - 0. В программе организованы следующие процедуры: BEGIN Инициализирует сегментные регистры, вызывает C10OPEN для создания файла и установки адреса DTA для DOS, вызывает D10PROC для ввода имени файла. Если ввод пустой, то происходит вызов G10PROC для завершения программы.C10OPEN Создает для файла элемент в директории, устанавли вает размер записей - 32 (шест.20) и инициали зирует адрес буфера DTA для DOS.D10PROC Выдает запрос на ввод имен, вводит имена с клавиа туры и вызывает процедуру F10WRIT для записи вводи мых имен на диск.E10DISP Управляет прокруткой и установкой курсора.F10WRIT Записывает имена в дисковой файл.G10CLSE Записывает маркер конца файла и закрывает файл.X10ERR Выдает на экран сообщение об ошибке в случае не корректной операции создания файла или записи данных. Каждая операция записи автоматически добавляет 1 кFCBSGRC (номер текущей записи) и шест.20 (размер записи) кFCBFLSZ (размер файла). Так как каждая запись имеет длину 32байта, то операция заносит в буфер 16 записей и затем записывает весь буфер в сектор диска. Ниже показано содержимое DTAи буфера: DTA: |текущая запись| Буфер: |запись 00|запись 01|запись 02|...|запись 15| Если пользователь ввел 25 имен, то счетчик записей увеличится от 1 до 25 (шест.19). Размер файла составит: 25 * 32 байта = 800 байтов или шест. 320 Ассемблер для IBM PC. Глава 16. 6 ------------------------------------------------------------------------------------------------------------------------ Рис. 16.1. Создание дискового файла. Операция закрытия заносит во второй сектор оставшиеся вбуфере девять записей и изменяет в оглавлении дату и рвзмерфайла. Размер записывается байтами в переставленном порядке:20030000. Последний буфер имеет следующий вид: Буфер: |запись 16|запись 17|...|запись 24|шест.1A|...|...| Для простоты в приведенной программе создаются записифайла, содержащие только одно поле. Записи большинствадругих файлов, однако, содержит различные символьные идвоичные поля и требуют описания записи в DTA. Если записисодержат двоичные числа, то не следует использовать маркерконца файла (EOF), так как двоичное число может совпасть сшест. кодом 1A. Для того, чтобы сделать программу более гибкой, можноразрешить пользователю указать дисковод, на котором находится или будет находиться файл. В начале выполнения программаможет выдать на экран сообщение, чтобы пользователь ввелномер дисковода, а затем изменить первый байт блока FCB. ПОСЛЕДОВАТЕЛЬНОЕ ЧТЕНИЕ ДИСКОВОГО ФАЙЛА------------------------------------------------------------ В базовой версии DOS программа, читающая дисковый файл,содержит блок управления файлом, который определяет файлточно так, как он был создан. В начале программа для открытия файла использует функцию шест. OF: MOV AH,OFH ; Открытие LEA DX,FCBname ; файла INT 21H ; Вызов DOS Операция открытия начинается с поиска в оглавлении элемента с именем и типом файла, определенными в FCB. Если такойэлемент не будет найден в оглавлении, то в регистре AL устанавливается шест. FF. Если элемент найден, то в регистре ALустанавливается 00 и в FCB заносится действительный размерфайла, а также устанавливается номер текущего блока в 0,длина записи в шест.80. После открытия можно заменить длинузаписи на другое значение. DTA должно содержать определение считываемой записи всоответствии с форматом, который использовался при созданиифайла. Для установки адреса DTA используется функцияшест.1A (не путать с маркером конца файла EOF шест.1A)аналогично созданию дискового файла: MOV AH,1AH ; Установка LEA DX,DTAname ; адреса DTA INT 21H ; Вызов DOS Ассемблер для IBM PC. Глава 16. 7 Для последовательного чтения записей с диска используетсяфункция шест.14: MOV AH,14H ; Последовательное LEA DX,FCBname ; чтение записей INT 21H ; Вызов DOS Чтение записи с диска по адресу DTA осуществляется на основе информации в блоке FCB. Операция чтения устанавливает врегистре AL следующие коды возврата: 00 Успешное чтение. 01 Конец файла, данные не прочитаны. 02 В DTA нет места для чтения одной записи. 03 Конец файла, прочитана частичная запись,заполненная нулями. Первая операция чтения заносит содержимое всего сектора вбуфер DOS. Затем операция определяет из блока FCB размерзаписи и пересылает первую запись из буфера в DTA. Последующие операции чтения пересылают остальные записи (если имеются) пока буфер не будет исчерпан. После этого операциячтения определяет адрес следующего сектора и заносит его содержимое в буфер. После успешной операции чтения в блоке FCB автоматическиувеличивается номер текущей записи на 1. Завершение последовательного чтения определяется программой по маркеру концафайла (EOF), для чего в программе имеется соответствующаяпроверка. Так как оглавление при чтении файла не изменяется, то обычно нет необходимости закрывать файл послезавершения чтения. Исключение составляют программы, которыеоткрывают и читают несколько файлов одновременно. Такиепрограммы должны закрывать файлы, так как DOS ограничиваетчисло одновременно открытых файлов. ПРОГРАММА: ИСПОЛЬЗОВАНИЕ FCB ДЛЯ ЧТЕНИЯ ДИСКОВОГО ФАЙЛА------------------------------------------------------------ На рис.16.2 приведена программа, которая выполняет чтениефайла, созданного предыдущей программой, и вывод на экранимен из записей файла. Обе программы содержат идентичныеблоки FCB, хотя, имена полей FCB могут быть различны.Содержимое полей имени и типа файла должны быть одинаковы. Программа содержит следующие процедуры: BEGIN Инициализирует сегментны регистра, вызывает про цедуру E10OPEN для открытия файла и установки DTA и вызывает F10READ для чтения записей. Если считан маркер конца файла, то программа завершается, если нет, то вызывается процедура G10DISP.E10OPEN Открывает файл, устанавливает значение размера и записей, равное 32 (шест.20), и инициализирует адрес DTA. Ассемблер для IBM PC. Глава 16. 8 F10READ Выполняет последовательное чтение записей. Опера ция чтения автоматически увеличивает номер текущей запи си в блоке FCB.G10DISP Выводит на экран содержимое прочитанной записи.X10ERR Выводит на экран сообщение об ошибке в случае некорректной операции открытия или чтения. ------------------------------------------------------------------------------------------------------------------------ Рис. 16.2. Чтение дискового файла Операция открытия выполняет поиск имени и типа файла воглавлении. Если необходимый элемент оглавления найден, тоавтоматически в блок FCB заносятся размер файла, дата идлина записей. Первая операция чтения записи с номером 00получает доступ к диску и считывает весь сектор (16 записей)в буфер. После этого первая запись заносится в DTA, а номертекущей записи в FCB увеличивается с 00 до 01: Буфер: |запись 00|запись 01|запись 02|... |запись 15| DTA : |запись 00| Второй операции чтения нет необходимого обращаться к диску. Так как требуемая запись уже находится в буфере, то операция просто пересылает запись 01 из буфера в DTA и увеличивает номер текущей записи на единицу. Таким же образом выполняются следующие операции чтения пока все 16 записей избуфера не будут обработаны. Операции чтения 16-ой записи приводит к физическомучтению следующего сектора в буфер и пересылка первой записисектора в DTA. Последующие операции чтения переносят остальные записи из буфера в DTA. Попытка прочитать послепоследней записи вызовет состояние конца файла и в регистрAL будет записан код возврата шест. 01. ПРЯМОЙ ДОСТУП------------------------------------------------------------ До сих пор в этой главе рассматривалась последовательнаяобработка дисковых файлов, которая адекватна как для создания файла, так и для печати его содержимого или внесения изменений в небольшие файлы. Если программа ограничена тольковозможностью последовательной обработки, то для измененияфайла она должна считывать каждую запись, вносить измененияв определенные из них и заносить записи в другой файл(программа может использовать один DTA, но потребуютсяразличные блоки FCB). Обычной практикой является чтениевходного файла с диска A и запись обновленного файла на дискB. Преимущество этого способа состоит в том, что он автоматически оставляет резервную копию. В некоторых случаях применяется доступ к конкретнымзаписям файла для получения информации, например, несколькихслужащих или о части ассортимента товаров. Для доступа,скажем, к 300-ой записи файла, последовательная обработка Ассемблер для IBM PC. Глава 16. 9 должна включать чтение всех 299 предшествующих записей, покане будет получена 300-я запись. Примечание: система можетначать обработку с конкретного номера блока и записи). Несмотря на то, что файл создается последовательно,доступ к записям может быть последовательным или прямым(произвольным). Требования прямой обработки, используюшейвызов DOS, заключаются в установке требуемого номера записив соответствующее поле FCB и выдаче команды прямого чтенияили записи. Произвольный доступ использует относительный номер записи(байты 33-36) в блоке FCB. Поле имеет размер двойного словаи использует обратную последовательность байт в словах.Для локализации требуемой записи система автоматически преобразует относительный номер записи в номер текущего блока(байты 12-13) и номер текущей записи (байт 32). ПРЯМОЕ ЧТЕНИЕ Операции открытия и установки DTA одинаковы как дляпрямой, так и для последовательной обработки. Предположим,что программа должна выполнить прямой доступ к пятой записифайла. Установим значение 05 в поле FCB для относительногономера записи и выполним команды для прямого чтения. Врезультате успешной операции содержимое пятой записи будетпомещено в DTA. Для прямого чтения записи необходимо поместить требуемое значение относительного номера записи в FCB и вызватьфункцию шест.21: MOV AH,21H ; Запрос на LEA DX,FCBname ; прямое чтение INT 21H ; Вызов DOS Операция чтения преобразует относительный номер записи вномера текущего блока и записи. Полученные значения используются для локализации требуемой дисковой записи, передачисодержимого записи в DTA и установки в регистр AL следующиезначения: 00 Успешное завершение 01 Данные не доступны 02 Чтение прекращено из-за нехватки места в DTA 03 Прочитана частичная запись,заполненная нулями. Как видно, среди перечисленных кодов возврата отсутствуетсостояние конец файла. При корректном чтении записи предполагается единственный код возврата - 00. Остальные кодывозврата могут являться результатом установки неправильногоотносительного номера записи или некорректная установкаадреса DTA или FCB. Так как такие ошибки легко допустить,то полезно выполнять проверку регистра AL на ненулевое значение. Ассемблер для IBM PC. Глава 16. 10 Когда программа выдает первый запрос на прямую запись,операция, используя оглавление для локализации сектора, накотором находится требуемая запись, считывает весь сектор сдиска в буфер и пересылает запись в DTA. Предположим, например, что записи имеют размер 128 байт, т.е. четыре записи водном секторе. Запрос на прямое чтение записи 23 приводит кчтению в буфер четырех записей, лежащих в одном секторе: | запись 20 | запись 21 | запись 22 | запись 23 | Когда программа вновь выдаст прямой запрос на запись,например, 23, то операция сначала проверит содержимое буфера. Так как данная запись уже находится в буфере, то онанепосредственно пересылается в DTA. Если программа запроситзапись 35, который нет в буфере, операция через оглавлениелокализует требуемую запись, считает весь сектор в буфер ипоместит запись в DTA. Таким образом, операции прямого доступа к записям более эффективны, если номера записей близкидруг к другу. ПРЯМАЯ ЗАПИСЬ Операция создания файла и установки DTA одинаковы как дляпрямого, так и для последовательного доступа. Для обработкифайла учета товаров программа может, используя прямой доступ, считать необходимую запись, внести, введенные вручную,изменения (например, новое количество товаров) и вернутьзапись на диск на то же место. Операция прямой записииспользует относительный номер записи в блоке FCB и функциюшест.22 следующим образом: MOV AH,22H ; Запрос на LEA DX,FCBname ; прямую запись INT 21H ; Вызов DOS Операция устанавливает в регистре AL следующие коды возврата: 00 Успешная операция 01 На диске нет места 02 Операция прекращена в результатенедостаточ ного места в DTA. При создании нового файла прямым доступом может быть получен ненулевой код возврата. Но при прямом чтении и переписывании измененных записей на том же месте диска код возвратадолжен быть только 00. Относительный номер записи в блоке FCB при прямом доступеимеет размер двойного слова (четыре байта), каждое слово записывается обратной последовательностью байтов. Для небольших файлов возможно потребуется установка лишь самого левого байта или слова, но для больших файлов установка номеразаписи в трех или в четырех байтах требует некоторойтщательности. Ассемблер для IBM PC. Глава 16. 11 ПРОГРАММА: ПРЯМОЕ ЧТЕНИЕ ДИСКОВОГО ФАЙЛА------------------------------------------------------------ На рис.16.3 приведена программа, которая считывает файл,созданный предыдущей программой (см.рис.16.1). Вводя любойотносительный номер записи, лежащей в границах файла, пользователь запрашивает вывод на экран любой записи файла. Еслифайл содержит 25 записей, то правильными номера являются номера от 00 до 24. Номер вводится с клавиатуры в ASCII формате и должен быть в нашем случае одно- или двухзначным числом. Программа содержит следующие процедуры: C10OPEN Открывает файл, устанавливает размер записи 32 и устанавливает адрес DTA.D10RECN Вводит номер записи с клавиатуры, преобразует его в двоичный формат и записывает полученное значение в FCB. В качестве усовершенствования процедуры можно вставить проверку вхождения номера в границы от 00 до 24.F10READ Помещает требуемую запись в DTA в соответствии с относительным номером записи в FCB.G10DISP Выводит запись на экран. Процедура D10RECN вводит номер записи с клавиатуры и проверяет длину ввода в списке параметров. Возможны три варианта: 00 Запрошен конец обработки 01 Введено однозначное число (в регистре AL) 02 Введено двухзначное число (в регистре AX) ------------------------------------------------------------------------------------------------------------------------ Рис.16.3. Прямое чтение дисковых записей. Данная процедура преобразует введенное число из ASCIIформата в двоичный формат. Так как значение находится в регистре AX, то лучше использовать команду AAD для преобразования. После преобразования двоичный код из регистра AXпересылается в два левых байта поля относительного номеразаписи в блоке FCB. Если, например, введено число 12 в ASCIIформате, то AX будет содержать 3132. Команда AND преобразуетэто значение в 0102, а команда AAD - в 000C. Результат преобразования заносится в поле относительного номера записиблока FCB в виде С000 0000. ПРЯМОЙ БЛОЧНЫЙ ДОСТУП------------------------------------------------------------ Если в программе имеется достаточно места, то одна прямаяблочная операция может записать весь файл из DTA на диск, атакже прочитать весь файл с диска в DTA. Данная особенностьвесьма полезна для записи на диск таблиц, которые другие программы могут считывать в память для обработки. Ассемблер для IBM PC. Глава 16. 12 Начать можно с любого правильного относительного номеразаписи. Число записей также может быть любым, хотя блок должен находится в пределах файла. Перед началом необходимооткрыть файл и инициализировать DTA. Для операции прямой блочной записи необходимо установитьв регистре СX требуемое число записей, установить в FCBстартовый относительный номер записи и выдать функциюшест.28: MOV AH,28H ; Операция прямой блочной записи MOV CX,records ; Установка числа записей LEA DX,FCBname ; INT 21H ; Вызов DOS Операция преобразует относительный номер записи в текущиеномер блока и номер записи. Полученные значения используютсядля определения начального адреса на диске. В результате операции в регистре AL устанавливаются следующие коды возврата: 00 Успешное завершение для всех записей 01 На диске недостаточно места. Кроме того операция устанавливает в FCB в поле относительного номера записи и полях текущих номеров блока и записи значения, соответствующие следующему номеру записи. Например, если были записаны записи с 00 до 24, то следующийномер записи будет 25 (шест.19). Для операции прямого блочного чтения необходимо установить в регистре CX требуемое число записей и использоватьфункцию шест.27: MOV AH,27H ; Операция прямого блочного чтения MOV CX,records ; Установка числа записей LEA DX,FCBname ; INT 21H ; Вызов DOS Операция чтения возвращает в регистре AL следующие значения: 00 Успешное чтение всех записей 01 Прочитана последняя запись файла 02 Прочитано предельное для DTA число записей 03 Прочитана последняя запись файла не полностью. В регистре CX остается действительное число прочитанныхзаписей, а в FCB в поле относительного номера записи и поляхтекущих номеров блока и записи устанавливаются значения,соответствующие следующему номеру записи. Если необходимо загрузить в память весь файл, но число записей неизвестно, то следует после операции открытия разделить размер файла на длину записи. Например, для размерафайла шест.320 (800) и длине записи шест.20 (32) число записей будет шест.19 (25). Ассемблер для IBM PC. Глава 16. 13 ПРОГРАММА: ПРЯМОЕ БЛОЧНОЕ ЧТЕНИЕ------------------------------------------------------------ На рис.16.4 приведена программа, выполняющая блочное чтение файла, созданного программой на рис.16.1. Программа устанавливает начальный относительный номер записи 00, в регистре CX - счетчик на 25 записей и выводит на экран всю информацию из DTA (только для того, чтобы убедиться, что информациясчитана). Другие варианты программы могут включать установку другого начального номера записи и считывание менее 25 записей. В программе организованы следующие процедуры: E10OPEN Открывает файл, устанавливает размер записи в FCB равным 32 и устанавливает адрес DTA.F10READ Устанавливает число записей равным 25 и выполняет блочное чтение.G10DISP Выводит блок на экран. Операция чтения преобразует относительный номер записи 00в FCB в номер текущего блока 00 и номер текущей записи 00.В конце операции чтения в FCB текущий номер записи будет содержать шест.19, а относительный номер записи - шест.19000000.------------------------------------------------------------------------------------------------------------------------ Рис. 16.4. Прямое блочное чтение. АБСОЛЮТНЫЕ ОПЕРАЦИИ ДИСКОВОГО ВВОДА-ВЫВОДА------------------------------------------------------------ Для непосредственного доступа к диску можно использоватьоперации абсолютного чтения и абсолютной записи с помощьюфункций DOS INT 25H и 26H. В этом случае не используютсяоглавление диска и преимущества блокирования и разблокирования записей, обеспечиваемые функцией DOS INT 21H. Абсолютные операции предполагают, что все записи имеютразмер сектора, поэтому прямой доступ осуществляется к полному сектору или блоку секторов. Адресация диска выполняетсяпо "логическому номеру записи" (абсолютный сектор). Дляопределения логического номера записи на двухстороннихдискетах с девятью секторами счет секторов ведется с дорожки0, сектора 1, следующим образом: Дорожка Сектор Логический номер записи 0 1 0 0 2 1 1 1 9 1 9 17 2 9 26 Для двухсторонних дискет используется следующая формула: Логический номер записи = (дорожка х 9) + (сектор - 1) Ассемблер для IBM PC. Глава 16. 14 Например, логический номер записи на дорожке 2 и секторе9 определяется как (2 х 9) + (9 - 1) = 18 + 8 = 26 Фрагмент программы для абсолютных операций ввода-вывода: MOV AL,drive# ; 0 для A, 1 для B и т.д. MOV BX,addr ; Адрес области ввода-вывода MOV CX,sectors ; Число секторов MOV DX,record# ; Начальный логический номер записи INT 25H или 26H ; Абсолютное чтение или запись Операции абсолютного чтения или запись разрушают содержимое всех регистров, кроме сегментных, и устанавливают флагCF для индикации успешной (0) или безуспешной (1) операции.В случае безуспешной операции содержимое регистра AL описывает характер ошибки: AL Причина 1000 0000 Устройство не отвечает 0100 0000 Ошибка установки головок 0010 0000 Ошибка контролера 0001 0000 Ошибка дискеты? 0000 1000 Переполнение DMA при чтении 0000 0100 Сектор не найден 0000 0011 Попытка записи на защищенной дискете 0000 0010 Не найден адресный маркер Команда INT записывает содержимое флагового регистра встек. После завершения команды INT следует восстановитьфлаги, но проверив перед этим флаг CF. ДРУГИЕ ДИСКОВЫЕ ОПЕРАЦИИ------------------------------------------------------------ Кроме основных дисковых функций DOS имеется несколькодополнительных полезных дисковых операций. Сброс диска: Шест. D Обычно нормальное закрытие файла приводит к занесениювсех оставшихся в буфере записей на диск и корректировке оглавления. В особых случаях (между шагами программы или аварийном завершении) может потребоваться сброс диска. ФункцияDOS шест. D освобождает все файловые буфера и не корректирует оглавление диска. Если необходимо, то вначале даннаяфункция закрывает все файлы. MOV AH,ODH ; Запрос на сброс диска INT 21H ; Вызов DOS Установка текущего дисковода: Шест. E Ассемблер для IBM PC. Глава 16. 15 Основное назначение функции DOS шест.E - установка номератекущего (по умолчанию) дисковода. Номер дисковода помещается в регистр DL, причем 0 соответствует дисководу A, 1 - B ит.д. MOV AH,OEH ; Запрос на установку MOV DL,02 ; дисковода C INT 21H ; Вызов DOS Операция возвращает в регистр AL число дисководов (независимо от типа). Так как для DOS необходимо по крайней мере 2логических дисковода A и B, то DOS возвращает значение 02 идля систем с одним дисководом. (Для определения действительного числа дисководов используется команда INT 11H). Поиск элементов оглавления: шест. 11 и 12 Программной утилите может потребоваться поиск в оглавлении для доступа к имени файла, например, при удалении илипереименовании. Для доступа к первому или единственномуэлементу оглавления необходимо загрузить в регистр DX адреснеоткрытого блока FCB и выполнить функцию 11H. Прииспользовании расширенного блока FCB можно также получитькод атрибута (см.техническое руководство по DOS). MOV AH,11H ; Запрос на первый элемент LEA DX,FCBname ; Неоткрытый FCB INT 21H ; Вызов DOS FCB может быть расположено по адресу 5CH в префиксе программного сегмента, предшествующем программе в памяти (DTAпо умолчанию). Подробно см. гл. 22. В регистре AL операция возвращает шест.FF, если элементне найден, и шест.00, если найден. Операция устанавливает вDTA номер дисковода (1=A, 2=B и т.д.) имя файла и тип файла. Если найдено несколько элементов при выборке по шаблону(например, *.ASM), то для локализации элементов подмножествадиректории используется функция 12H: MOV AH,12H ; Запрос следующего элемента LEA DX,FCBname ; Неоткрытый FCB INT 21H ; Вызов DOS Коды возврата в регистре AL аналогичны кодам функции 11H. Удаление файла: шест.13 Для удаления файла в программе используется функция DOS13H. Операция удаления устанавливает специальный байт впервой позиции имени файла в оглавлении. MOV AH,13H ; Запрос на удаление файла LEA DX,FCBname ; Неоткрытый FCB INT 21H ; Вызов DOS Если операция находит и удаляет элемент, то в регистре ALустанавливается код возврата 00, иначе код равен шест.FF. Ассемблер для IBM PC. Глава 16. 16 Переименование файла: шест. 17 Для переименования файла в программе используется функцияDOS шест.17. Старое имя файла записывается в обычном местеблока FCB, а новое - начиная со смещения 16. MOV AH,17H ; Запрос на переименование LEA DX,FCBname ; Адрес FCB INT 21H ; Вызов DOS Символы ? и * в новом имени приводят к сохранению в соответствующих позициях символов из старого имени. Успешная операция устанавливает в регистре AL код возврата 00, абезуспешная (файл по старому имени не найден или по новомуимени уже существует) - код FF. Получение текущего номера дисковода: шест.19 Функция DOS шест.19 позволяет определить текущий номердисковода: MOV AH,19H ; Получить текущий дисковод INT 21H ; Вызов DOS Операция возвращает шест. номер дисковода в регистре AL(0=A, 1=B и т.д.). Полученное значение можно поместитьнепосредственно в FCB для доступа к файлу с текущего дисковода. Кроме перечисленных существуют функции для полученияинформации из таблицы FAT (1B и 10), установки поля прямойзаписи (24), установки вектора прерываний (25), созданиянового программного сегмента (26) и анализа имени файла(29). Эти функции описаны в техническом руководстве по DOS. ПРОГРАММА: ВЫБОРОЧНОЕ УДАЛЕНИЕ ФАЙЛОВ------------------------------------------------------------ На рис.16.5 приведена COM-программа по имени SDEL,иллюстрирующая функции DOS 11H, 12H и 13H для удаления выбранных файлов. Для запроса на удаление файлов пользовательможет ввести,например, следующие команды: SDEL *.* (все файлы) SDEL *.BAK (все BAK-файлы) SDEL TEST.* (все файлы по имени TEST) Посредством DOS программа определяет в оглавлении элементы, удовлетворяющие запросу. DOS заносит полное имя найденного элемента в PSP (префикс программного сегмента) по смещению шест.81 (DTA по умолчанию). Затем программа выводит наэкран имя файла и запрос подтверждения. Ответ Y (да) разрешает удаление, N (нет) сохраняет файл, а Return завершаетвыполнение. Ассемблер для IBM PC. Глава 16. 17 Обратите внимание на то, что данная программа должна бытьсоздана как COM-программа, так как EXE-программа требуютотличной адресации для использования смещений шест.5С и 81в PSP. Для тестирования программы используйте скопированныевременно файлы.------------------------------------------------------------------------------------------------------------------------ Рис.16.5. Выборочное удаление файлов. ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ------------------------------------------------------------- Программа, использующая INT 21H в базовой версии DOS для операций ввода-вывода на диск, должна содержать блок управления файлом (FCB) для каждого доступного файла.- Один блок содержит 128 записей. Номер текущего блока и номер текущей записи в FCB указывают на дисковую запись, которая должна быть обработана.- В обратной последовательности байт в FCB записываются следующие элементы: номер текущего блока, размер записи, размер файла и относительный номер записи.- Все программы, обрабатывающие один и тот же файл, должны иметь одинаково описанный блок FCB.- Область ввода-вывода (DTA) определяется адресом памяти, куда должна быть помещена запись при чтении или откуда она заносится на диск. Прежде, чем выполнить операцию записи или чтения, в программе необходимо установить каждую область DTA.- Операция открытия файла устанавливает в блоке FCB значе ния для следующих элементов: имя файла, тип файла, размер запи си (шест.80), размер файла и дата. Программа должна заменить размер записей на правильное значение.- Программа, использующая для записи файла операцию DOS INT 21H, должна закрыть файл в конце обработки для того, чтобы поместить на диск все оставшиеся в буфере записи (если таковые имеются) и скорректировать соответствующий элемент оглавления.- При использовании для чтения и записи операции DOS INT 21H система автоматически изменяет текущий номер записи в FCB.- Операция чтения по прерыванию DOS INT 21H проверяет наличие требуемой записи сначала в буфере и при отсутствии выполняет чтение с диска.- Прямой метод доступа требует указания номера записи в поле относительного номера записи блока FCB.- Восемь байт (двойное слово) относительного номера записи кодируются в обратной последовательности байт.- Если требуемая запись при прямом доступе уже находится в буфере, то система передает ее непосредственно в DTA. В противном случае выполняется чтение с диска в буфер всего сектора, содержащего необходимую запись.- Операции прямого блочного чтения и записи более эффек тивны при наличии достаточной памяти. Эти операции особенно удобны для загрузки таблиц. Ассемблер для IBM PC. Глава 16. 18 - Команды DOS INT 25H и 26H осуществляют дисковые операции абсолютного чтения и записи, но не поддерживают обработку оглавления, не определяют конец файла и не обеспечивают блокирование и деблокирование записей. ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ------------------------------------------------------------16.1. Напишите функции базовой версии DOS для с

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти