установить каждую область DTA.
- Операция открытия файла устанавливает в блоке FCB значения для
следующих элементов: имя файла, тип файла, размер записи (шест.80), размер
файла и дата. Программа должна заменить размер записей на правильное
значение.
- Программа, использующая для записи файла операцию DOS INT 21H,
должна закрыть файл в конце обработки для того, чтобы поместить на диск
все оставшиеся в буфере записи (если таковые имеются) и скорректировать
соответствующий элемент оглавления.
- При использовании для чтения и записи операции DOS INT 21H система
автоматически изменяет текущий номер записи в FCB.
- Операция чтения по прерыванию DOS INT 21H проверяет наличие
требуемой записи сначала в буфере и при отсутствии выполняет чтение с
диска.
- Прямой метод доступа требует указания номера записи в поле
относительного номера записи блока FCB.
- Восемь байт (двойное слово) относительного номера записи кодируются
в обратной последовательности байт.
- Если требуемая запись при прямом доступе уже находится в буфере, то
система передает ее непосредственно в DTA. В противном случае выполняется
чтение с диска в буфер всего сектора, содержащего необходимую запись.
- Операции прямого блочного чтения и записи более эффективны при
наличии достаточной памяти. Эти операции особенно удобны для загрузки
таблиц.
- Команды 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 Буксиры
122 10520 Лифты
124 21335 Процессоры
127 00960 Станки для наклеивания меток
232 05635 Черпатели?
999 00000
16.10. Измените программу из вопроса 16.9 так, чтобы цены
записывались на диск в двоичном формате.
16.11. Измените программу из вопроса 16.9 так, чтобы а)
использовалась операция прямого чтения, б) пользователь мог вводить номер
и количество товара и в) выполнялось вычисление и вывод на экран стоимости
(произведение количества товара на стоимость единицы товара).
ГЛАВА 17 Дисковая память 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 - принтер.
Для доступа к диску при создании или открытии файла используется
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 Нет больше файлов
__________________________________________________________________________
Таб.17.1. Коды ошибок
СОЗДАНИЕ ДИСКОВОГО ФАЙЛА
________________________________________________________________
В последующих разделах раскрыты требования к созданию, записи и
закрытию дисковых файлов для расширенной версии 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 для перезаписи.
В случае возникновения ошибки операция устанавливает флаг 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