Функция 3AH. Назначение: удаление пустого каталога. Действие функции аналогично команде DOS «RMDIR». Для выполнения функции в регистровую пару DS:DX необходимо занести адрес ASCIIZ-строки с именем удаляемого каталога. ASCIIZ-строка для функции 3AH может и
Функция 3AH. Назначение: удаление пустого каталога. Действие функции аналогично команде DOS «RMDIR». Для выполнения функции в регистровую пару DS: DX необходимо занести адрес ASCIIZ-строки с именем удаляемого каталога. ASCIIZ-строка для функции 3AH может иметь максимум 64 символа (не включая признак конца строки). Удаляемый каталог также не должен быть текущим и для него не должны быть активными такие программы DOS как JOIN и SUBST. Пример использования функции 3AH: DirName DB ‘c: \games’, 0; имя удаляемого каталога . . . MOV AH, 3AH MOV DX, OFFSET DirName ; ASCIIZ-строка INT 21H Функция 47H. Назначение: получение текущего каталога для указанного или текущего диска. Для выполнения функции регистровая пара DS: SI должна содержать адрес области памяти, куда функция 47H занесет значение текущего каталога в формате ASCIIZ. Регистр DL должен содержать номер диска: 0 – текущий, 1 – A, 2 – B и т. д. Область памяти, куда заносится имя текущего каталога, должна быть достаточно большой, чтобы содержать пути максимальной длины. Пример использования функции 47H: CurDir DB 256 DUP (? ) ; область памяти . . . MOV AH, 47H MOV DL, 3 ; диск ‘C: ’ MOV SI, OFFSET DirName; адрес области памяти INT 21H Функция 3BH. Назначение: установка текущего каталога. Действие функции аналогично команде DOS «CHDIR». Для выполнения функции регистровая пара DS: SI должна содержать адрес ASCIIZ-строки, определяющей значение текущего каталога. ASCIIZ-строка также может содержать букву диска, для которого устанавливается текущий каталог. Если буква диска не указана, используется текущий диск. Максимальный размер ASCIIZ-строки – 64 символа, не включая признак конца строки. Пример использования функции 3BH:
CurDir DB ‘c: \games’, 0 ; значение текущего каталога . . . MOV AH, 3BH MOV DX, OFFSET DirName ; ASCIIZ-строка INT 21H Поиск файлов по шаблону DOS включает две функции, с помощью которых можно искать файлы по заданному шаблону. Шаблон представляет собой ASCIIZ-строку, которая может содержать букву диска, путь и шаблон имени файла. Шаблон имени файла – такой же, как и для команды DOS «DIR». Функция 4EH. Назначение: поиск первого файла по шаблону. Для выполнения этой функции в регистровой паре DS: DX необходимо указать адрес ASCIIZ-строки, содержащей шаблон, а в регистре CX – атрибут, с которым будут искаться файлы (см. табл. 6. 1). Также для выполнения функции 4EH нужно установить адрес так называемой области передачи данных. Применительно к функции 4EH эта область содержит значения, необходимые для дальнейшего поиска файлов. Для того чтобы установить адрес области передачи данных необходимо в регистровую пару DS: DX занести требуемый адрес, и вызвать функцию 1AH прерывания DOS 21H. В качестве области передачи данных можно использовать область памяти, отведенную под командную строку (она начинается по смещению 0080H от начала префикса программного сегмента). Таким образом, для установки адреса области передачи данных в регистр DS можно занести сегмент префикса программного сегмента, а в регистр DX – смещение 0080H, а затем вызвать функцию 1AH прерывания DOS 21H. Если файл по указанному шаблону не найден, функция 4EH устанавливает флаг CF и записывает в регистр AX значение кода ошибки 18 (нет больше файлов). Если файл найден, то область передачи данных заполняется структурой, значения полей которой представлены в таблице 11. Таблица 11 Поля структуры области передачи данных.
Поля этой структуры можно использовать для получения информации о найденном файле. Для проведения аналогии, можно отметить, что функция 4EH выполняет такие же действия, что и процедура FindFirst библиотеки DOS языка Паскаль. Функция 4EH обычно всегда используется совместно с функцией 4FH, как будет рассмотрено далее. Функция 4FH. Назначение: поиск следующего файла по шаблону. Для выполнения этой функции регистровая пара DS: DX должна содержать адрес области передачи данных, заполненной функцией 4EH. Если следующий файл по шаблону не найден, функция 4FH устанавливает флаг CF и записывает в регистр AX значение кода ошибки 18 (нет больше файлов). Если файл найден, то область передачи данных заполняется новыми данными о найденном файле. Функция 4FH выполняет такие же действия, что и процедура FindNext библиотеки DOS языка Паскаль. Процесс поиска файлов по шаблону с использованием функций 4EH и 4FH включает следующие шаги: 1. установка адреса области передачи данных функцией 1AH; 2. поиск первого файла по шаблону функцией 4EH; 3. если в регистре AX – код ошибки 18 (нет больше файлов), то переход на шаг 8. 4. установка в регистровой паре DS: DX адреса области передачи данных для функции 4FH; 5. поиск следующего файла по шаблону функцией 4FH; 6. если в регистре AX – код ошибки 18 (нет больше файлов), то переход на шаг 8. 7. повтор поиска – переход на шаг 5. 8. завершение поиска файлов. При помощи функций 4EH и 4FH можно искать не только файлы, но и каталоги, а также метки дисков – для этого нужно установить в регистре CX для функции 4EH необходимые значения атрибута. Чтобы найти файлы с любыми атрибутами в регистре CX нужно установить все биты атрибутов файлов. Следующий пример демонстрирует программу, которая выводит на экран имена всех файлов и каталогов из текущего каталога и указывает тип найденного элемента оглавления (файл или каталог). FileInfo STRUC ; структура области передачи данных DB 21 DUP (? ) ; резерв DOS Attr DB? ; атрибут файла Time DW? ; время файла Date DW? ; дата файла FSize DD? ; размер файла FName DB 13 DUP (? ); имя файла
FileInfo ENDS CODE SEGMENT ASSUME CS: CODE, DS: CODE; CS и DS указывают на сегмент CODE DB 80H DUP (? ) ; пропуск 80H байт Info FileInfo < > ; переменная типа FileInfo ORG 100H ; программа типа COM Start: MOV DX, 0080H ; в DX – смещение ; области передачи данных INT 1AH ; установка адреса ; области передачи данных MOV AH, 4EH ; функция поиска первого файла MOV DX, OFFSET Template; смещение шаблона MOV CX, 00110111B ; атрибуты – все файлы и каталоги INT 21H ; вызов DOS JC Exit ; переход, если файлы не найдены M1: CALL OutString ; вывод имени файла на экран MOV DX, 0080H ; в DX – смещение ; области передачи данных MOV AH, 4FH ; функция поиска следующего файла INT 21H ; вызов DOS JNC M1 ; повтор поиска, если есть еще файлы Exit: RET выход из программы OutString PROC ; процедура вывода имени файла ; в SI – смещение имени файла MOV SI, OFFSET Info. Fname MOV DX, SI ; сохранение его в DX M2: MOV DI, SI ; в DI – предыдущее значение SI LODSB ; поиск нуля CMP AL, 0 ; в ASCIIZ-строке JNZ M2 MOV AL, ' ' ; символ для заполнения M3: STOSB ; заполнение ASCIIZ-строки CMP DI, OFFSET Info. FName + 13; если не достигнут ; конец строки, JB M3 ; то заполнение следующей позиции MOV BYTE PTR [DI], '$' ; формирование строки для ; функции 09H MOV AH, 09H ; функция вывода строки INT 21H ; вызов DOS MOV CX, 10 ; вывод 10 пробелов
MOV AH, 02H ; функция вывода символа MOV DL, ' ' ; символ пробела M4: INT 21H ; вызов DOS LOOP M4 ; цикл по CX TEST Info. Attr, 10H; проверка на каталог MOV DX, OFFSET File; в DX смещение строки File JZ M5 MOV DX, OFFSET Subdir; в DX смещение строки Subdir M5: MOV AH, 09H ; функция вывода строки INT 21H ; вызов DOS MOV AH, 02H ; функция вывода символа MOV DL, 0DH ; символ перевода строки INT 21H ; вызов DOS MOV DL, 0AH ; символ перевода курсора в начало строки INT 21H ; вызов DOS RET ; возврат из процедуры OutString ENDP Template DB '*. *', 0 ; шаблон для поиска файлов File DB '< File> $' Subdir DB '< SubDir> $' CODE ENDS END Start ; точка входа В предложенном примере программы следует обратить внимание на расположение в программе переменной Info – она располагается перед директивой ORG. Если бы поля структуры были определены, то компоновщик выдал бы ошибку, так как COM программа должна начинаться с команды. Но определение переменной Info не определяет данные, так как переменная остается неинициализированной. Такой способ расположения переменных (перед директивой ORG) можно использовать, чтобы далее в программе обращаться к полям префикса программного сегмента. Переменная Info, например, настроена на начало командной строки, которая используется под область передачи данных. Определение DB 80H DUP (? ) нужно для настройки переменной Info на смещение 0080H в префиксе программного сегмента.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|