0000 0010 Не найден адресный маркер
Команда int записывает содержимое флагового регистра в стек. После завершения команды int следует восстановить флаги, но проверив перед этим флаг cf.
4.10. Другие операции
Кроме основных дисковых функций DOS имеется несколько дополнительных полезных дисковых операций.
4.11. Сброс диска
Обычно нормальное закрытие файла приводит к занесению всех оставшихся в буфере записей на диск и корректировке оглавления. В особых случаях (например, при аварийном завершении) может потребоваться сброс диска. Функция DOS 0dh освобождает все файловые буферы и не корректирует оглавление диска. Если необходимо, то вначале данная функция закрывает все файлы.
mov ah,0dh |
; запрос на сброс диска |
int 21h |
; вызов DOS |
|
4.12. Установка текущего дисковода |
Основное назначение функции DOS 0eh установка номера текущего (по умолчанию) дисковода. Номер дисковода помещается в регистр dl, причем 0 соответствует дисководу A, 1 B и т.д.
mov |
ah,0eh |
; запрос на установку |
mov |
dl,02 |
; дисковода C |
int 21h |
; вызов DOS |
|
Операция возвращает в регистр al число дисководов (независимо от типа). Так как для DOS необходимо, по крайней мере, два логических дисковода (A и B), то DOS возвращает значение 02 и для систем с одним дисководом. Для определения действительного числа дисководов используется команда int 11h.
4.13. Поиск элементов оглавления
Для доступа к имени файла, например при удалении или переименовании, может потребоваться поиск в оглавлении. Для доступа к первому или единственному элементу оглавления
36
необходимо загрузить в регистр dx адрес неоткрытого блока FCB и выполнить функцию 11h. При использовании расширенного блока FCB можно также получить код атрибута:
mov ah,11h |
; запрос на первый элемент |
lea dx,FCBname |
; неоткрытый FCB |
int 21h |
; вызов DOS |
В регистре al операция возвращает следующие значения:
|
Таблица 4.13 |
al |
Значение кода возврата |
00 |
Элемент найден |
FF |
Элемент не найден |
Операция устанавливает в DTA номер дисковода (1=A, 2=B и т.д.), имя файла и тип файла. Если найдено несколько элементов при выборке по шаблону (например, *.asm), то для локализации элементов подмножества директории используется функция 12h:
mov ah,12h |
; запрос следующего элемента |
lea dx,FCBname |
; неоткрытый FCB |
int 21h |
; вызов DOS |
Коды возврата в регистре al аналогичны кодам функции 11h.
4.14. Удаление файла
Для удаления файла в программе используется функция 13h. Операция удаления устанавливает специальный байт в первой позиции имени файла в оглавлении.
mov ah,13h |
; запрос на удаление файла |
lea dx,FCBname |
; неоткрытый FCB |
int 21h |
; вызов DOS |
Если операция находит и удаляет элемент, то в регистре al устанавливается код возврата 00, иначе код равен шестнадцатеричному FF.
4.15. Переименование файла
Для переименования файла в программе старое имя файла записывается в обычном месте блока FCB, а новое начиная со смещения 16.
mov ah,17h |
; запрос на переименование |
lea dx,FCBname |
; адрес FCB |
int 21h |
; вызов DOS |
|
37 |
Символы ? и * в новом имени приводят к сохранению в соответствующих позициях символов из старого имени. Успешная операция устанавливает в регистре al код возврата 00, а безуспешная (файл по старому имени не найден или по новому имени уже существует) код FF.
4.16. Получение текущего номера дисковода
Функция 19h позволяет определить текущий номер дисковода:
mov ah,19h |
; получить текущий дисковод |
int 21h |
; вызов DOS |
Операция возвращает шестнадцатеричный номер дисковода в регистре al (0=A, 1=B и т.д.). Полученное значение можно поместить непосредственно в FCB для доступа к файлу с текущего дисковода.
Кроме перечисленных существуют функции для получения информации из таблицы FAT (1B и 10), установки поля прямой записи (24), установки вектора прерываний (25), создания нового программного сегмента (26) и анализа имени файла (29). Эти функции описаны в техническом руководстве по DOS.
Контрольные вопросы
1.Общие сведенья о работе с файлами.
2.Назначение блока управления файлом (FCB).
3.Как осуществляется создание, запись и закрытие файла.
4.Как осуществляется открытие, запись и закрытие файла.
5.Как осуществляется открытие, чтение и закрытие файла.
6.Какие значения принимают по умолчанию номер текущего блока и размер записей при открытии файла?
7.Назначение области DTA? Как инициализируется адрес DTA?
8.Как инициализируется адрес DTA при обработке нескольких файлов (например, чтение из двух файлов, побайтное суммирование и запись полученных сумм в третий файл)?
9.Последовательное чтение дискового файла. Замена длины записи.
10.Прямой доступ к дисковому файлу. Относительный номер
записи.
11.Прямое чтение записей дискового файла. Использование относительного номера записи.
12.Прямая запись в дисковый файл. Использование относительного номера записи.
38
13.Прямой блочный доступ: прямая блочная запись, задание количества записей, стартовый относительный номер записи. Как используются номер текущего блока и текущий номер записи?
14.Прямой блочный доступ: как загрузить в память весь файл, когда число записей неизвестно?
15.Абсолютные операции дискового ввода-вывода. Длина записи при выполнении операций абсолютного чтения и абсолютной записи
спомощью функций DOS.
16.Сброс диска. В каких случаях осуществляется, и что при этом выполняется. Получение текущего номера дисковода.
17.Установка текущего дисковода. Удаление файла.
18.Напишите функции базовой версии DOS для следующих операций:
а) создание файла; б) установка DTA;
в) последовательная запись; г) открытие файла; д) последовательное чтение.
19.Программа использует размер записи, устанавливаемый при открытии файла по умолчанию.
а) сколько записей содержит один сектор?
б) сколько записей содержит дискета с тремя дорожками по девять секторов на каждой?
в) если на дискете (б) находится один файл, то при последовательном чтении сколько произойдет физических обращений к диску?
20.Определите текущий блок и запись для следующих номеров записей при прямом доступе: а) 45, б) 73, в) 150, г) 260.
21.В каком виде номер записи 2652 (десятичное) устанавливается в поле относительной записи блока FCB?
22.Укажите шестнадцатеричные номера функций для следующих операций:
а) прямая запись, б) прямое чтение,
в) прямая блочная запись, г) прямое блочное чтение.
23.Напишите команды для определения числа записей файла, предполагая, что операция открытия уже выполнена.
Имена полей с размером файла fcbflsz и размером записи fcbfcsz.
39
24.Составьте блок-схему программы, которая вводит данные с клавиатуры и записывает эти данные на диск в двоичном формате.
25.Составьте блок-схему программы, которая использует операцию прямого чтения с диска данных в двоичном формате и вывод их на экран.
40