Страница:
В регистре 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
Для удаления файла в программе используется функция DOS
13H. Операция удаления устанавливает специальный байт в
первой позиции имени файла в оглавлении.
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 для следующих опе
раций: а) создание файла, б) установка DTA, в) после
довательная запись, г) открытие файла, д) последова
тельное чтение.
16.2. Программа использует размер записи, устанавливаемый
при открытии файла по умолчанию. а) Сколько записей
содержит один сектор? б) Сколько записей содержит
дискета с тремя дорожками по девять секторов на
каждой? в) Если на дискете (б) находится один файл,
то при последовательном чтении сколько произойдет
физических обращений к диску?
16.3. Напишите программу, которая создает дисковый файл,
содержащий записи из трех элементов: номер товара
(пять символов), наименование товара (12 символов) и
стоимость единицы товара (одно слово). Ввод этих
значений должен осуществляться пользователем с
клавиатуры. Не забудьте преобразовать числа из ASCII
представления в двоичное представление.
16.4. Напишите программу, которая выводит на экран файл,
созданный в вопросе 16.3.
16.5. Определите текущий блок и запись для следующих
номеров записей при прямом доступе: а)45, б)73,
в)150, г)260.
16.6. В каком виде номер записи 2652 (десятичное) устанавли
вается в поле относительной записи блока FCB?
16.7. Укажите шестнадцатеричные номера функций для следу
ющих операций: а) прямая запись, б) прямое чтение, в)
прямая блочная запись, г) прямое блочное чтение.
16.8. Напишите команды для определения числа записей файла,
предполагая, что операция открытия уже выполнена.
Имена полей с размером файла FCB FLSZ и размером
записи FCB FCSZ.
16.9. Используя программу из вопроса 16.4 для создания
файла с количеством, ценами и наименованиями товаров,
сформируйте файл с приведенными ниже данными.
Напишите программу, которая выполняет одно блочное
чтение данного файла и выводит каждую запись на
экран.
Номер Цена Наименование
023 00315 Ассемблеры
024 00430 Компановщики
027 00525 Компиляторы
049 00920 Компрессоры
114 11250 Экстракторы
117 00630 Буксиры
Ассемблер для IBM PC. Глава 16. 19
122 10520 Лифты
124 21335 Процессоры
127 00960 Станки для наклеивания меток
232 05635 Черпатели?
999 00000
16.10. Измените программу из вопроса 16.9 так, чтобы цены
записывались на диск в двоичном формате.
16.11. Измените программу из вопроса 16.9 так, чтобы а) ис
пользовалась операция прямого чтения, б) пользователь
мог вводить номер и количество товара и в) выполня
лось вычисление и вывод на экран стоимости (произве
дение количества товара на стоимость единицы товара).
Ассемблер для IBM PC. Глава 17. 1
------------------------------------------------------------
Дисковая память III: Расширенные функции DOS
Цель: Ознакомить с расширенными функциями DOS, начиная с
версии 2.0 для обработки дисковых файлов.
ВВЕДЕНИЕ
------------------------------------------------------------
Функции базовой версии DOS для обработки файлов, показан
ные в главе 16, действительны для всех последующих версий
DOS. В данной главе показаны ряд расширенных функций, введен
ных в версиях DOS 2.0 и 3.0 и не поддерживаемых в ранних вер
сиях. Прежде, чем пытаться выполнить дисковые операции из
данной главы, следует убедиться в наличии необходимой версии
DOS.
Многие из расширенных функций проще своих аналогов в базо
вой версии DOS. В руководствах по DOS рекомендуется исполь
зовать новые функции, которые более естественны для систем
типа UNIX. Некоторые операции включают использование строк
в формате ASCIIZ для начальной установки дисковода, пути
доступа и имени файла; номера файла для последовательного
доступа к файлу; специальных кодов возврата.
ДАННЫЕ В ФОРМАТЕ ASCIIZ
------------------------------------------------------------
При использовании многих расширенных функций для диско
вых операций необходимо сообщить DOS адрес строки в формате
ASCIIZ, содержащей идентификацию файла в виде номера диско-
вода, пути доступа и имени файла (все параметры необязатель
ные) и строка должна завершаться шестнадцатеричным нулем,
например:
PATHNM1 DB 'B:\TEST.ASM',0
PATHNM2 DB 'C:\UTILITY\NU.EXE',0
Обратная косая (или прямая косая) используются в качест
ве разделителя. Нулевой байт (zero) завершает строку (отсюда
название ASCIIZ формата). Для прерываний, использующих в ка
честве параметра ASCIIZ строку, адрес этой строки загружает
ся в регистр DX, например, командой LEA DX,PATHNM1.
ФАЙЛОВЫЙ НОМЕР И КОДЫ ВОЗВРАТА
------------------------------------------------------------
Операции создания и открытия файла требуют загрузки в
регистр AX двухбайтового числа, представляющего собой файло
вый номер. В главе 8 показано, что стандартные устройства
не нуждаются в операции открытия и могут использовать
непосредственно файловые номера: 0 - ввод, 1 - вывод, 2 -
вывод сообщений об ошибках, 3 - внешнее устройство, 4 - прин
тер.
Ассемблер для IBM PC. Глава 17. 2
Для доступа к диску при создании или открытии файла ис
пользуется ASCIIZ строка и функции DOS шест. 3C или 3D. Ус
пешная операция устанавливает флаг CF в 0 и помещает файло
вый номер в регистр AX. Этот номер необходимо сохранить в
элементе данных DW и использовать его для всех последующих
операций над дисковым файлом. При неуспешной операции флаг
CF устанавливается в 1, а в регистр AX помещается код ошиб-
ки, зависящий от операции (см.табл.17.1).
01 Ошибка номера функции
02 Файл не найден
03 Путь доступа не найден
04 Открыто слишком много файлов
05 Нет доступа (Операция отвергнута)
06 Ошибка файлового номера
07 Блок управления памятью разрушен
08 Недостаточно памяти
09 Ошибка адреса блока памяти
10 Ошибка оборудования
11 Ошибка формата
12 Ошибка кода доступа
13 Ошибка данных
15 Ошибка дисковода
16 Попытка удалить оглавление
17 Другое устройство ?
18 Нет больше файлов
СОЗДАНИЕ ДИСКОВОГО ФАЙЛА
------------------------------------------------------------
В последующих разделах раскрыты требования к созданию,
записи и закрытию дисковых файлов для расширенной версии
DOS.
Создание файла: Шест.3C
Для создания нового файла или переписывания старого файла
используется функция шест.3C. При этом регистр DX должен
содержать адрес ASCIIZ-строки, а регистр CX - необходимый
атрибут. Байт атрибут был рассмотрен в главе 15; для обычно
го файла значение атрибута - 0.
Рассмотрим пример создания обычного файла:
MOV AH,3CH ; Запрос на создание
MOV CX,00 ; обычного файла
LEA DX,PATHNM1 ; ASCIIZ строка
INT 21H ; Вызов DOS
JC error ; Переход по ошибке
MOV HANDLE1,AX ; Сохранение файлового номера в DW
При правильном открытии операция создает элемент оглав
ления с данным атрибутом, очищает флаг CF и устанавливает
файловый номер в регистре AX. Этот номер должен использо
ваться для всех последующих операций. Если создаваемый файл
уже существует (т.е. имя файла присутствует в оглавлении),
то длина этого файла устанавливается в 0 для перезаписи.
Ассемблер для IBM PC. Глава 17. 3
В случае возникновения ошибки операция устанавливает флаг
CF в 1 и помещает в регистр AX код возврата: 03, 04 или 05
(см.табл.17.1). Код 05 свидетельствует либо о переполнении
оглавления, либо о защите существующего файла атрибутом
"только чтение". При завершении операции необходимо сначала
проверить флаг CF, так как при создании файла возможна
установка в регистре AX файлового номера 0005, который можно
легко спутать с кодом ошибки 05 (нет доступа).
Запись файла: шест.40
Для записи файла используется функция DOS шест.40. При
этом в регистре BX должен быть установлен файловый номер,
в регистре CX - число записываемых байт, а в регистре DX -
адрес области вывода. В следующем примере происходит запись
256 байт из области OUTREC:
HANDLE1 DW ?
OUTREC DB 256 DUP (' ')
MOV AH,40H ; Запрос записи
MOV BX,HANDLE1 ; Файловый номер
MOV CX,256 ; Длина записи
LEA DX,OUTREC ; Адрес области вывода
INT 21H ; Вызов DOS
JC error2 ; Проверка на ошибку
CMP AX,256 ; Все байты записаны?
JNE error3
Правильная операция записывает из памяти на диск все дан
ные (256 байт), очищает флаг CF и устанавливает в регистре
AX число действительно записанных байтов. Если диск перепол
нен, то число записанных байтов может отличаться от задан
ного числа. В случае неправильной операции флаг CF устанав
ливается в 1, а в регистр AX заносится код 05 (нет доступа)
или 06 (ошибка файлового номера).
Закрытие файла : шест.3E
После завершения записи файла необходимо установить файло
вый номер в регистр BX и, используя функцию DOS шест.3E,
закрыть файл. Эта операция записывает все оставшиеся еще
данные из буфера на диск и корректирует оглавление и табли
цу FAT.
MOV AH,3EH ; Запрос на закрытие файла
MOV BX,HANDLE1 ; Файловый номер
INT 21H ; Вызов DOS
В случае ошибки в регистре AX устанавливается код 06
(неправильный файловый номер).
ПРОГРАММА:ИСПОЛЬЗОВАНИЕ ФАЙЛОВОГО НОМЕРА ДЛЯ СОЗДАНИЯ ФАЙЛА.
------------------------------------------------------------
Программа, приведенная на рис.17.2, создает файл по
имени, которое вводится пользователем с клавиатуры. В
программе имеются следующие основные процедуры:
Ассемблер для IBM PC. Глава 17. 4
C10CREA Использует функцию шест.3C для создания файла и
сохраняет файловый номер в элементе данных по
имени HANDLE.
D10PROC Принимает ввод с клавиатуры и очищает пробелом
байты от конца введенного имени до конца области
ввода.
F10WRIT Записывает файл, используя функцию шест.40.
G10CLSE В завершении обработки, используя функцию шест.3E,
закрывает файл для того, чтобы создать правильный
элемент оглавления.
Область ввода имеет длину 30 байтов и завершается двумя
байтами: возврат каретки (шест.0DH) и конец строки (шест.
0AH). Таким образом общая длина области ввода - 32 байта.
Программа переносит на диск 32-x байтовые записи, как записи
фиксированной длины. Можно опустить байты "возврат каретки"
и "конец строки", но включить их, если потребуется сорти
ровка файла. Программа DOS SORT требует наличия этих байтов
для индикации конца записей. Для нашего примера команда SORT
может выглядеть следующим образом:
SORT B:<NAMEFILE.DAT >NAMEFILE.SRT
В результате выполнения данной команды записи из файла
NAMEFILE.DAT в возрастающей последовательности будут поме
щены в файл NAMEFILE.SRT. Программа, приведенная на рис.17.3
выполняет чтение записей из файла NAMEFILE.SRT и вывод их
на экран. Обратите внимание на два момента: 1) Символы воз-
врат каретки и конец строки включены в конце каждой записи
только для выполнения сортировки и в других случаях могут
быть опущены. 2) Записи могут иметь переменную длину (по
длине вводимых с клавиатуры имен); эта особенность включает
некоторое дополнительное программирование, как это будет по
казано на рис.17.4.
------------------------------------------------------------
------------------------------------------------------------
Рис.17.2. Использование файлового номера для создания файла.
ЧТЕНИЕ ДИСКОВОГО ФАЙЛА
------------------------------------------------------------
В следующих разделах раскрыты требования для открытия и
чтения дисковых файлов в расширенной версии DOS.
Открытие файла: шест.3D
Если в программе требуется прочитать дисковый файл, то
прежде необходимо открыть его, используя функцию шест.3D.
Эта операция проверяет правильность имени файла и его нали
чие на диске. При открытии регистр DX должен содержать ад
рес необходимой ASCIIZ-строки, а регистр AL - код доступа:
0 Открыть файл только для ввода
1 Открыть файл только для вывода
Ассемблер для IBM PC. Глава 17. 5
2 Открыть файл для ввода и вывода
Остальные биты регистра AL используются для разделения фай
лов DOS версии 3.0 и старше (см.техническое руководство по
DOS). Обратите внимание, что для записи файла используется
функция создания (шест.3C), но не функция открытия файла.
Ниже приведен пример открытия файла для чтения:
MOV AH,3DH ; Запрос на открытие
MOV AL,00 ; Только чтение
LEA DX,PATHNM1 ; Строка в формате ASCIIZ
INT 21H ; Вызов DOS
JC error4 ; Выход по ошибке
MOV HANDLE2,AX ; Сохранение номера в DW
Если файл с необходимым именем существует, то операция
открытия устанавливает длину записи равной 1, принимает
существующий атрибут, сбрасывает флаг CF и заносит файловый
номер в регистр AX. Файловый номер используется в дальней
шем для всех последующих операций.
Если файл отсутствует, то операция устанавливает флаг CF
и заносит в регистр AX код ошибки: 02, 04, 05 или 12 (см.
рис.17.1). Не забывайте проверять флаг CF. При успешном
создании файла система может установить в регистре AX файло
вый номер 0005, что легко можно спутать с кодом ошибки 05
(нет доступа).
Чтение файла: Шест.3F
Для чтения записей файла используется функция DOS шест.
3F. При этом необходимо установить в регистре BX файловый
номер, в регистре CX - число байтов и в регистре DX - адрес
области ввода. В следующем примере происходит считывание
512-байтовой записи:
HANDLE2 DW ?
INPREC DB 512 DUP (' ')
MOV AH,3FH ; Запрос на чтение
MOV BX,HANDLE2 ; Файловый номер
MOV CX,512 ; Длина записи
LEA DX,INPREC ; Адрес области ввода
INT 21H ; Вызов DOS
JC error5 ; Проверка на ошибку
CMP AX,00 ; Прочитано 0 байтов?
JE endfile
Правильно выполненная операция считывает запись в память,
сбрасывает флаг CF и устанавливает в регистре AX число
действительно прочитанных байтов. Нулевое значение в регист
ре AX обозначает попытку чтения после конца файла. Ошибочная
операция устанавливает флаг CF и возращает в регистре AX
код ошибки 05 (нет доступа) или 06 (ошибка файлового номе
ра).
Ассемблер для IBM PC. Глава 17. 6
Так как DOS ограничивает число одновременно открытых
файлов, то программа, успешно отработавшая с несколькими
файлами, должна закрывать их.
ПРОГРАММА: ИСПОЛЬЗОВАНИЕ ФАЙЛОВОГО НОМЕРА ДЛЯ ЧТЕНИЯ ФАЙЛА
------------------------------------------------------------
На рис.17.3 приведена программа, которая читает файл,
созданный предыдущей программой (см.рис.17.2) и отсорти
рованный командой DOS SORT. Для открытия файла используется
записей, а в 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
Для удаления файла в программе используется функция DOS
13H. Операция удаления устанавливает специальный байт в
первой позиции имени файла в оглавлении.
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 для следующих опе
раций: а) создание файла, б) установка DTA, в) после
довательная запись, г) открытие файла, д) последова
тельное чтение.
16.2. Программа использует размер записи, устанавливаемый
при открытии файла по умолчанию. а) Сколько записей
содержит один сектор? б) Сколько записей содержит
дискета с тремя дорожками по девять секторов на
каждой? в) Если на дискете (б) находится один файл,
то при последовательном чтении сколько произойдет
физических обращений к диску?
16.3. Напишите программу, которая создает дисковый файл,
содержащий записи из трех элементов: номер товара
(пять символов), наименование товара (12 символов) и
стоимость единицы товара (одно слово). Ввод этих
значений должен осуществляться пользователем с
клавиатуры. Не забудьте преобразовать числа из ASCII
представления в двоичное представление.
16.4. Напишите программу, которая выводит на экран файл,
созданный в вопросе 16.3.
16.5. Определите текущий блок и запись для следующих
номеров записей при прямом доступе: а)45, б)73,
в)150, г)260.
16.6. В каком виде номер записи 2652 (десятичное) устанавли
вается в поле относительной записи блока FCB?
16.7. Укажите шестнадцатеричные номера функций для следу
ющих операций: а) прямая запись, б) прямое чтение, в)
прямая блочная запись, г) прямое блочное чтение.
16.8. Напишите команды для определения числа записей файла,
предполагая, что операция открытия уже выполнена.
Имена полей с размером файла FCB FLSZ и размером
записи FCB FCSZ.
16.9. Используя программу из вопроса 16.4 для создания
файла с количеством, ценами и наименованиями товаров,
сформируйте файл с приведенными ниже данными.
Напишите программу, которая выполняет одно блочное
чтение данного файла и выводит каждую запись на
экран.
Номер Цена Наименование
023 00315 Ассемблеры
024 00430 Компановщики
027 00525 Компиляторы
049 00920 Компрессоры
114 11250 Экстракторы
117 00630 Буксиры
Ассемблер для IBM PC. Глава 16. 19
122 10520 Лифты
124 21335 Процессоры
127 00960 Станки для наклеивания меток
232 05635 Черпатели?
999 00000
16.10. Измените программу из вопроса 16.9 так, чтобы цены
записывались на диск в двоичном формате.
16.11. Измените программу из вопроса 16.9 так, чтобы а) ис
пользовалась операция прямого чтения, б) пользователь
мог вводить номер и количество товара и в) выполня
лось вычисление и вывод на экран стоимости (произве
дение количества товара на стоимость единицы товара).
Ассемблер для IBM PC. Глава 17. 1
------------------------------------------------------------
Дисковая память III: Расширенные функции DOS
Цель: Ознакомить с расширенными функциями DOS, начиная с
версии 2.0 для обработки дисковых файлов.
ВВЕДЕНИЕ
------------------------------------------------------------
Функции базовой версии DOS для обработки файлов, показан
ные в главе 16, действительны для всех последующих версий
DOS. В данной главе показаны ряд расширенных функций, введен
ных в версиях DOS 2.0 и 3.0 и не поддерживаемых в ранних вер
сиях. Прежде, чем пытаться выполнить дисковые операции из
данной главы, следует убедиться в наличии необходимой версии
DOS.
Многие из расширенных функций проще своих аналогов в базо
вой версии DOS. В руководствах по DOS рекомендуется исполь
зовать новые функции, которые более естественны для систем
типа UNIX. Некоторые операции включают использование строк
в формате ASCIIZ для начальной установки дисковода, пути
доступа и имени файла; номера файла для последовательного
доступа к файлу; специальных кодов возврата.
ДАННЫЕ В ФОРМАТЕ ASCIIZ
------------------------------------------------------------
При использовании многих расширенных функций для диско
вых операций необходимо сообщить DOS адрес строки в формате
ASCIIZ, содержащей идентификацию файла в виде номера диско-
вода, пути доступа и имени файла (все параметры необязатель
ные) и строка должна завершаться шестнадцатеричным нулем,
например:
PATHNM1 DB 'B:\TEST.ASM',0
PATHNM2 DB 'C:\UTILITY\NU.EXE',0
Обратная косая (или прямая косая) используются в качест
ве разделителя. Нулевой байт (zero) завершает строку (отсюда
название ASCIIZ формата). Для прерываний, использующих в ка
честве параметра ASCIIZ строку, адрес этой строки загружает
ся в регистр DX, например, командой LEA DX,PATHNM1.
ФАЙЛОВЫЙ НОМЕР И КОДЫ ВОЗВРАТА
------------------------------------------------------------
Операции создания и открытия файла требуют загрузки в
регистр AX двухбайтового числа, представляющего собой файло
вый номер. В главе 8 показано, что стандартные устройства
не нуждаются в операции открытия и могут использовать
непосредственно файловые номера: 0 - ввод, 1 - вывод, 2 -
вывод сообщений об ошибках, 3 - внешнее устройство, 4 - прин
тер.
Ассемблер для IBM PC. Глава 17. 2
Для доступа к диску при создании или открытии файла ис
пользуется ASCIIZ строка и функции DOS шест. 3C или 3D. Ус
пешная операция устанавливает флаг CF в 0 и помещает файло
вый номер в регистр AX. Этот номер необходимо сохранить в
элементе данных DW и использовать его для всех последующих
операций над дисковым файлом. При неуспешной операции флаг
CF устанавливается в 1, а в регистр AX помещается код ошиб-
ки, зависящий от операции (см.табл.17.1).
01 Ошибка номера функции
02 Файл не найден
03 Путь доступа не найден
04 Открыто слишком много файлов
05 Нет доступа (Операция отвергнута)
06 Ошибка файлового номера
07 Блок управления памятью разрушен
08 Недостаточно памяти
09 Ошибка адреса блока памяти
10 Ошибка оборудования
11 Ошибка формата
12 Ошибка кода доступа
13 Ошибка данных
15 Ошибка дисковода
16 Попытка удалить оглавление
17 Другое устройство ?
18 Нет больше файлов
СОЗДАНИЕ ДИСКОВОГО ФАЙЛА
------------------------------------------------------------
В последующих разделах раскрыты требования к созданию,
записи и закрытию дисковых файлов для расширенной версии
DOS.
Создание файла: Шест.3C
Для создания нового файла или переписывания старого файла
используется функция шест.3C. При этом регистр DX должен
содержать адрес ASCIIZ-строки, а регистр CX - необходимый
атрибут. Байт атрибут был рассмотрен в главе 15; для обычно
го файла значение атрибута - 0.
Рассмотрим пример создания обычного файла:
MOV AH,3CH ; Запрос на создание
MOV CX,00 ; обычного файла
LEA DX,PATHNM1 ; ASCIIZ строка
INT 21H ; Вызов DOS
JC error ; Переход по ошибке
MOV HANDLE1,AX ; Сохранение файлового номера в DW
При правильном открытии операция создает элемент оглав
ления с данным атрибутом, очищает флаг CF и устанавливает
файловый номер в регистре AX. Этот номер должен использо
ваться для всех последующих операций. Если создаваемый файл
уже существует (т.е. имя файла присутствует в оглавлении),
то длина этого файла устанавливается в 0 для перезаписи.
Ассемблер для IBM PC. Глава 17. 3
В случае возникновения ошибки операция устанавливает флаг
CF в 1 и помещает в регистр AX код возврата: 03, 04 или 05
(см.табл.17.1). Код 05 свидетельствует либо о переполнении
оглавления, либо о защите существующего файла атрибутом
"только чтение". При завершении операции необходимо сначала
проверить флаг CF, так как при создании файла возможна
установка в регистре AX файлового номера 0005, который можно
легко спутать с кодом ошибки 05 (нет доступа).
Запись файла: шест.40
Для записи файла используется функция DOS шест.40. При
этом в регистре BX должен быть установлен файловый номер,
в регистре CX - число записываемых байт, а в регистре DX -
адрес области вывода. В следующем примере происходит запись
256 байт из области OUTREC:
HANDLE1 DW ?
OUTREC DB 256 DUP (' ')
MOV AH,40H ; Запрос записи
MOV BX,HANDLE1 ; Файловый номер
MOV CX,256 ; Длина записи
LEA DX,OUTREC ; Адрес области вывода
INT 21H ; Вызов DOS
JC error2 ; Проверка на ошибку
CMP AX,256 ; Все байты записаны?
JNE error3
Правильная операция записывает из памяти на диск все дан
ные (256 байт), очищает флаг CF и устанавливает в регистре
AX число действительно записанных байтов. Если диск перепол
нен, то число записанных байтов может отличаться от задан
ного числа. В случае неправильной операции флаг CF устанав
ливается в 1, а в регистр AX заносится код 05 (нет доступа)
или 06 (ошибка файлового номера).
Закрытие файла : шест.3E
После завершения записи файла необходимо установить файло
вый номер в регистр BX и, используя функцию DOS шест.3E,
закрыть файл. Эта операция записывает все оставшиеся еще
данные из буфера на диск и корректирует оглавление и табли
цу FAT.
MOV AH,3EH ; Запрос на закрытие файла
MOV BX,HANDLE1 ; Файловый номер
INT 21H ; Вызов DOS
В случае ошибки в регистре AX устанавливается код 06
(неправильный файловый номер).
ПРОГРАММА:ИСПОЛЬЗОВАНИЕ ФАЙЛОВОГО НОМЕРА ДЛЯ СОЗДАНИЯ ФАЙЛА.
------------------------------------------------------------
Программа, приведенная на рис.17.2, создает файл по
имени, которое вводится пользователем с клавиатуры. В
программе имеются следующие основные процедуры:
Ассемблер для IBM PC. Глава 17. 4
C10CREA Использует функцию шест.3C для создания файла и
сохраняет файловый номер в элементе данных по
имени HANDLE.
D10PROC Принимает ввод с клавиатуры и очищает пробелом
байты от конца введенного имени до конца области
ввода.
F10WRIT Записывает файл, используя функцию шест.40.
G10CLSE В завершении обработки, используя функцию шест.3E,
закрывает файл для того, чтобы создать правильный
элемент оглавления.
Область ввода имеет длину 30 байтов и завершается двумя
байтами: возврат каретки (шест.0DH) и конец строки (шест.
0AH). Таким образом общая длина области ввода - 32 байта.
Программа переносит на диск 32-x байтовые записи, как записи
фиксированной длины. Можно опустить байты "возврат каретки"
и "конец строки", но включить их, если потребуется сорти
ровка файла. Программа DOS SORT требует наличия этих байтов
для индикации конца записей. Для нашего примера команда SORT
может выглядеть следующим образом:
SORT B:<NAMEFILE.DAT >NAMEFILE.SRT
В результате выполнения данной команды записи из файла
NAMEFILE.DAT в возрастающей последовательности будут поме
щены в файл NAMEFILE.SRT. Программа, приведенная на рис.17.3
выполняет чтение записей из файла NAMEFILE.SRT и вывод их
на экран. Обратите внимание на два момента: 1) Символы воз-
врат каретки и конец строки включены в конце каждой записи
только для выполнения сортировки и в других случаях могут
быть опущены. 2) Записи могут иметь переменную длину (по
длине вводимых с клавиатуры имен); эта особенность включает
некоторое дополнительное программирование, как это будет по
казано на рис.17.4.
------------------------------------------------------------
------------------------------------------------------------
Рис.17.2. Использование файлового номера для создания файла.
ЧТЕНИЕ ДИСКОВОГО ФАЙЛА
------------------------------------------------------------
В следующих разделах раскрыты требования для открытия и
чтения дисковых файлов в расширенной версии DOS.
Открытие файла: шест.3D
Если в программе требуется прочитать дисковый файл, то
прежде необходимо открыть его, используя функцию шест.3D.
Эта операция проверяет правильность имени файла и его нали
чие на диске. При открытии регистр DX должен содержать ад
рес необходимой ASCIIZ-строки, а регистр AL - код доступа:
0 Открыть файл только для ввода
1 Открыть файл только для вывода
Ассемблер для IBM PC. Глава 17. 5
2 Открыть файл для ввода и вывода
Остальные биты регистра AL используются для разделения фай
лов DOS версии 3.0 и старше (см.техническое руководство по
DOS). Обратите внимание, что для записи файла используется
функция создания (шест.3C), но не функция открытия файла.
Ниже приведен пример открытия файла для чтения:
MOV AH,3DH ; Запрос на открытие
MOV AL,00 ; Только чтение
LEA DX,PATHNM1 ; Строка в формате ASCIIZ
INT 21H ; Вызов DOS
JC error4 ; Выход по ошибке
MOV HANDLE2,AX ; Сохранение номера в DW
Если файл с необходимым именем существует, то операция
открытия устанавливает длину записи равной 1, принимает
существующий атрибут, сбрасывает флаг CF и заносит файловый
номер в регистр AX. Файловый номер используется в дальней
шем для всех последующих операций.
Если файл отсутствует, то операция устанавливает флаг CF
и заносит в регистр AX код ошибки: 02, 04, 05 или 12 (см.
рис.17.1). Не забывайте проверять флаг CF. При успешном
создании файла система может установить в регистре AX файло
вый номер 0005, что легко можно спутать с кодом ошибки 05
(нет доступа).
Чтение файла: Шест.3F
Для чтения записей файла используется функция DOS шест.
3F. При этом необходимо установить в регистре BX файловый
номер, в регистре CX - число байтов и в регистре DX - адрес
области ввода. В следующем примере происходит считывание
512-байтовой записи:
HANDLE2 DW ?
INPREC DB 512 DUP (' ')
MOV AH,3FH ; Запрос на чтение
MOV BX,HANDLE2 ; Файловый номер
MOV CX,512 ; Длина записи
LEA DX,INPREC ; Адрес области ввода
INT 21H ; Вызов DOS
JC error5 ; Проверка на ошибку
CMP AX,00 ; Прочитано 0 байтов?
JE endfile
Правильно выполненная операция считывает запись в память,
сбрасывает флаг CF и устанавливает в регистре AX число
действительно прочитанных байтов. Нулевое значение в регист
ре AX обозначает попытку чтения после конца файла. Ошибочная
операция устанавливает флаг CF и возращает в регистре AX
код ошибки 05 (нет доступа) или 06 (ошибка файлового номе
ра).
Ассемблер для IBM PC. Глава 17. 6
Так как DOS ограничивает число одновременно открытых
файлов, то программа, успешно отработавшая с несколькими
файлами, должна закрывать их.
ПРОГРАММА: ИСПОЛЬЗОВАНИЕ ФАЙЛОВОГО НОМЕРА ДЛЯ ЧТЕНИЯ ФАЙЛА
------------------------------------------------------------
На рис.17.3 приведена программа, которая читает файл,
созданный предыдущей программой (см.рис.17.2) и отсорти
рованный командой DOS SORT. Для открытия файла используется