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
--------------------------------------
Основное назначение функции 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.
Переименование файла: шест.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.
ПРОГРАММА: ВЫБОРОЧНОЕ УДАЛЕНИЕ ФАЙЛОВ
________________________________________________________________
__________________________________________________________________________
TITLE SELDEL (COM) Выборочное удаление файлов
; Предполагается текущий дисковод;
; Примеры параметров: *.*, *.BAK, и т.д.
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
BEGIN JMP MAIN
; ----------------------------------------------------------
TAB EQU 09
LF EQU 10
CR EQU 13
CRLF DB CR,LF,'$'
DELMSG DB TAB,'Erase','$'
ENDMSG DB CR,LF,'No more directory entries',CR,LF,'$'
ERRMSG DB 'Write protected disk','$'
PROMPT DB 'y = Erase, N = Keep, Ret = Exit',CR,LF,'$'
; ----------------------------------------------------------
MAIN PROC NEAR ;Главная процедура
MOV AH,11H ;Найти первый элемент
CALL D10DISK
CMP AL,0FFH ;Если нет элементов,
JE A90 ; то выйти
LEA DX,PROMPT ;Текст запроса
CALL B10DISP
A20:
LEA DX,DELMSG ;Выдать сообщение
CALL B10DISP ; об удалении файла
MOV CX,11 ;11 символов
MOV SI,81H ;Начало имени файла
A30:
MOV DL,[SI] ;Текущий символ
CALL C10CHAR ; для вывода на экран
INC SI ;Следующий символ
LOOP A30
MOV DL,'?'
CALL C10CHAR
MOV AH,01 ;Получить односимвольный
INT 21H ; ответ
CMP AL,ODH ;Символ Return?
JE A90 ; да - выйти
OR AL,00100000B ;Перекодировать
; в прописную букву
CMP AL,'y' ;Запрошено удаление?
JNE A50 ; нет - обойти,
MOV AH,13H ; да - удалить файл
MOV DX,80H
INT 21H
CMP AL,0 ;Успешное удаление?
JZ A50 ; да - обойти
LEA DX,ERRMSG ; нет - выдать
CALL B10DISP ; предупреждение
JMP A90
A50:
LEA DX,CRLF ;Перевести строку на экране
CALL B10DISP
MOV AH,12H
CALL B10DISK ;Получить следующий элемент
CMP AL,0FFH ;Есть еще?
JNE A20 ; да - повторить
A90:
RET ;Выход в DOS
MAIN ENDP
; Вывод строки на экран;
; ---------------------
B10DISP PROC NEAR ;в DX находится адрес
MOV AH,09 ; строки
INT 21H
RET
B10DISP ENDP
; Вывод символа на экран;
; ----------------------
C10CHAR PROC NEAR ;в DL находится символ
MOV AH,02
INT 21H
RET
C10CHAR ENDP
; Чтение элемента каталога:
; ------------------------
D10DISK PROC NEAR
MOV DX,5CH ;Установить FCB
INT 21H
CMP AL,0FFH ;Есть еще элементы?
JNE D90
PUSH AX ;Сохранить AL
LEA DX,ENDMSG
CALL B10DISP
POP AX ;Восстановить AL
D90: RET
D10DISK ENDP
CODESG ENDS
END BEGIN
__________________________________________________________________________
Рис.16.5. Выборочное удаление файлов.
На рис.16.5 приведена COM-программа по имени SDEL, иллюстрирующая
функции DOS 11H, 12H и 13H для удаления выбранных файлов. Для запроса на
удаление файлов пользователь может ввести,например, следующие команды:
SDEL *.* (все файлы)
SDEL *.BAK (все BAK-файлы)
SDEL TEST.* (все файлы по имени TEST)
Посредством DOS программа определяет в оглавлении элементы,
удовлетворяющие запросу. DOS заносит полное имя найденного элемента в PSP
(префикс программного сегмента) по смещению шест.81 (DTA по умолчанию).
Затем программа выводит на экран имя файла и запрос подтверждения. Ответ Y
(да) разрешает удаление, N (нет) сохраняет файл, а Return завершает
выполнение.
Обратите внимание на то, что данная программа должна быть создана как
COM-программа, так как EXE-программа требуют отличной адресации для
использования смещений шест.5С и 81 в PSP. Для тестирования программы
используйте скопированные временно файлы.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Программа, использующая INT 21H в базовой версии DOS для операций
ввода-вывода на диск, должна содержать блок управления файлом (FCB) для
каждого доступного файла.
- Один блок содержит 128 записей. Номер текущего блока и номер
текущей записи в FCB указывают на дисковую запись, которая должна быть
обработана.
- В обратной последовательности байт в FCB записываются следующие
элементы: номер текущего блока, размер записи, размер файла и
относительный номер записи.
- Все программы, обрабатывающие один и тот же файл, должны иметь
одинаково описанный блок FCB.
- Область ввода-вывода (DTA) определяется адресом памяти, куда должна
быть помещена запись при чтении или откуда она заносится на диск. Прежде,
чем выполнить операцию записи или чтения, в программе необходимо