Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Функция 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

Поля структуры области передачи данных.

Смещение (десятичное) Размер поля (в байтах) Описание
Зарезервировано DOS для последующего поиска
Атрибут файла
Время файла
Дата файла
Размер файла
Имя и расширение в виде ASCIIZ-строки

 

Поля этой структуры можно использовать для получения информации о найденном файле. Для проведения аналогии, можно отметить, что функция 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...