Сборник по задачам и примерам Assembler

Получить номер заданного по умолчанию дисковода



Получить номер заданного по умолчанию дисковода

Вход: АН = 19h.

Выход: AL - номер дисковода (00h - A:, 01h - В: и т. д.).

:prg07_14.asm - программа получения номера текущего (по умолчанию) дисковода функцией 19h.

I .code

m ;.....Получить номер текущего (по умолчанию) дисковода ---

movah.l9h :номер функции DOS

1nt2lh

jc exit -.переход в случае ошибки :в al номер текущего диска

Выбрать заданный по умолчанию диск

Вход: АН = OEh; DL = номер нового диска по умолчанию (00h = A:, 01h = В: и т. д.).
Выход: AL = максимально возможный в данной системе номер дисковода (00h =

A:, 01h = В: и т. д.) определяется на основе параметра LASTDRIVE в файле

CONFIG.SYS.



Получить информацию о свободном дисковом пространстве

Вход: АН = 36h; DL = номер диска (00h- текущий,01h = А: и т. д.).

Выход: АХ = FFFFh — неправильный номер устройства в DL,

иначе: АХ = число секторов в одном кластере; ВХ - число свободных кластеров; СХ = размер сектора (в байтах); DX = общее число кластеров на диске.

Используя информацию, возвращаемую функцией 36h, можно подсчитать как свободное пространство на диске — произведение АХ*ВХ*СХ, так и полный объем диска — произведение AX*CX*DX.

MS DOS предоставляет следующие возможности для манипулирования каталогами: создание и удаление каталога, получение информации о текущем каталоге и его смена.

Создание каталога

Вход: АН = 39h; DS:DX — ASCIZ-строка пути к создаваемому каталогу. Выход: АХ = не определен (CF ¦ 0); АХ - код ошибки (CF = 1): 3 — несуществующий путь; 5 — доступ запрещен.

Путь к каталогу должен содержать перечисление всех каталогов начиная от корневого на пути к создаваемому каталогу, при этом они, естественно, должны существовать. Последнее имя каталога — имя создаваемого каталога.

;prg07_15.asm - программа демонстрации создания каталога функцией 39h.

.data

dname db "c:\windows\my_diг".0

point_dname dd dname

.code

;.....создадим каталог в каталоге c:\windows.......-.......

Ids пате;формируем указатель на строку с именем нового каталога


movah,39h :номер функции DOS

int 21h

jc exit ;переход в случае ошибки

Удаление каталога

Вход: АН = 3Ah; DS:DX — ASCIZ-строка пути к удаляемому каталогу. Выход: CF = 0 — АХ = не определен; АХ = код ошибки (CF = 1): 3 — несуществующий путь; 5 — доступ запрещен; 10h — попытка удаления текущего каталога. Удаляемый каталог должен быть пустым.

:prg07_16.asm - программа демонстрации удаления каталога функцией ЗАп.

.data

dname db "c:\windows\my_diг",О point_dname dd dname

.code

:----удалим каталог my_dir в каталоге c:\windows---------

Ids dx.point_dname;формируем указатель на строку с именем нового каталога movah.3ah :номер функции DOS *

int 21h

jc exit ;переход в случае ошибки

Изменить текущий каталог

MS DOS позволяет установить текущий каталог для того, чтобы не указывать полный путь для последующих операций с файлами. При необходимости можно получить полный путь к текущему каталогу в виде ASCIZ-строки. Вход: АН = 3Bh; DS:DX — указатель на буфер, содержащий полный путь от корневого каталога в виде ASCIZ-строки (до 64 байт). Выход: CF = 0 — АХ = не определен; CF = 1 — АХ = код ошибки: 03h — путь не найден.

:prg07_17.asm - программа демонстрации изменения текущего каталога функцией ЗВп.

.data

dname db "c:\windows",0

point_dname dd dname

.code

|.........

:.....изменим текущий каталог на каталог c:\windows--------

Ids dx.point_dname:формируем указатель на строку с именем нового каталога

movah.3bh :номер функции DOS

int21h

jc exit . :переход в случае ошибки

;.........

Получение текущего каталога

Вход: Ан = 47h;

DL = номер устройства (00h= текущее (по умолчанию),01h = А: и т. д.) DS:SI — указатель на 64-байтный буфер для записи полного пути от корневого каталога (ASCIZ-строка).

рыход: АХ = не определен или 0100h(CF=0);

АХ = код ошибки (CF=1): OFh — недопустимый дисковод.

:prg07_18.asm - программа демонстрации получения текущего каталога функцией 47h.

.data

dname db "e:\tools".О

point_dname dd dname

d_cur_name db 64 dup (20h).0



point_d_cur_name dd d_cur_name

.code

:..... изменим текущий каталог на каталог \tools ...........

Ids dx,point_dname;формируем указатель на строку с именем нового каталога

movah,3bh ;номер функции DOS

int 21h

jc exit :переход в случае ошибки

:----получим текущий каталог......-----.....

Ids si,point_d_cur_name ;формируем указатель на строку с именем нового каталога

mov ah.47h ;номер функции DOS

int 21h

jc exit :переход в случае ошибки

Возвращаемый путь не содержит имени диска и первого символа \.

Последняя проблема, на которой мы остановимся в этом разделе, — проблема поиска файлов. Для поиска в каталогах используется пара функций 4eh и 4fh. В имени искомого файла можно указывать символы шаблона * и ?. Совместное использование функций 4eh и 4fh подчинено следующему алгоритму. Первой вызывается функция 4eh. В качестве параметров ей передаются адрес ASCIZ-строки с путем к искомому файлу и комбинация его атрибутов. Имя файла может быть задано в виде шаблона. В случае успеха (cf=0), то есть при обнаружении первого подходящего шаблону файла, данная функция помещает его имя и расширение в область DTA со смещением leh от ее начала (см. таблицу ниже). Далее можно либо открыть файл, либо продолжить поиск, но уже функцией 4fh. При работе с шаблоном функцию 4fh можно вызывать циклически, до тех пор пока в процессе перебора не будут просмотрены имена всех подходящих файлов. Об этом можно узнать по состоянию флага cf, которое должно стать равным 1 в случае, когда файлов, удовлетворяющих шаблону, в данном каталоге больше нет.

Поиск первого соответствующего шаблону файла

Вход: АН = 4Eh; СХ = атрибуты файла (биты 0 и 5 игнорируются); DS:DX — ASCIZ-имя файла (возможно, с путем к нему и символами шаблона * и ?).

Выход: если CF - 0, то в DTA возвращается блок данных для первого найденно го файла (см. ниже). Если CF - 0, то в АХ - код ошибки: 2 — файл не най" ден; 3 — несуществующий путь; 12h — больше файлов в каталоге нет Область DTA (Data Transfer Area) располагается в префиксе программист



сегмента со смещением 80h от его начала и занимает 128 байт. При успешном

окончании поиска функция 4Eh (и 4Fh тоже) помещает блок данных, имеющий

приведенный ниже формат.

Смещение

Размер в байтах

Описание

00h

1

Буква логического диска, если бит 7 = 0, то удаленный диск

01h

И

Поисковый шаблон

0Сh

1

Атрибуты поиска

0Dh

2

Порядковый номер файла в каталоге

0Fh

2

Номер кластера начала каталога предыдущего уровня

11h

4

Резерв

15h

1

Атрибуты найденного файла

16h

2

Время создания (модификации) файла

18h

2

Дата создания файла

1Ah

4

Размер файла

1Eh

13

ASCIZ-имя файла с расширением

После анализа данной области в программе принимается решение об окончании или продолжении поиска.

В качестве шаблона можно задать символы *.*, тогда мы сможем получить имена и проанализировать все файлы в текущем каталоге. Это может понадобиться при программировании операции перемещения или копирования каталога.

Найти следующий соответствующий шаблону файл

Вход: АН = 4Fh; в области DTA должен содержаться блок данных, заполненный единственным вызовом 4eh в начале поиска.

Выход: если CF = 0 — успех; если CF = 1 — в АХ = код ошибки: 12h — больше файлов в каталоге нет.

Для работы с DTA в системе MS DOS существуют две функции lah и 2fh. После старта программы текущей DTA является область по адресу PSP:OO8Oh. Мы уже имели с ней дело, когда рассматривали проблему обработки содержимого командной строки.

Получить адрес области DTA

Для выполнения работы, связанной с файлами, MS DOS предоставляет возможность установить свою область DTA.

Вход: АН = 2Fh.

Выход: ES:BX — адрес области, которую впоследствии функцией lah можно сделать текущей областью DTA для последующих операций ввода-вывода.

установить текущую область DTA

Вход: АН - 1Ah; DS:DX — адрес области, которая будет областью DTA для последующих файловых операций.

Понятно, что даже если мы устанавливаем свою область DTA, все смещения и данные, формируемые функциями 4Eh 4Fh, остаются актуальными.

 

Содержание раздела