Поиск файла с помощью функции DOS 4EH

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Vano
Сообщения: 41
Зарегистрирован: 16 авг 2004, 22:21
Откуда: Днепропетровск
Контактная информация:

В описании которое я нашёл говорится:
DS :D X = адрес спецификации
При возврате: имя файла и каталог заносятся в область передачи данных в байты 1Eh - 2Ah.

Вот как я пытаюсь считать имя файла:
-----------------

Код: Выделить всё

mov dx, 1Eh     ;(здесь я не уверен что прав!!)
vivod ............  ;(это макрос который выводит имя файла на экран)
-----------------

К примеру имя файла b и файлов с таким именем несколько в моём каталоге. Я ввожу имя файла, который хочу найти: b.*
При нахождении первого файла мне на экран выводит b.* (а мне надо получить здесь полное имя файла), а при нахождении остальных файлов мне вообще на экран выводит "бурду" какуютою.
Я почти уверен, что я неправильно указываю адрес в котором должно находиться имя найденого файла.
Подскажите кто знает как сделать.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Конечно неправильно.
Вот примерная программка.

Код: Выделить всё

; Немного описалова.	
; Вход:
; AH - 4Eh
; DS:DX - адрес строки поиска
; CX - атрибуты
; Выход:
; AX - код ошибки (в случае если встал CF)
; DTA - результаты

; простой примерчик - выводим список всех файлов в каталоге
	.model tiny
	.code
	org 100h
start:
    ; по умолчанию DTA находится в PSP, но мы можем задать ей другое расположение
    ; (а можем и работать со старым адресом). вобщем переместим
    mov ah,1ah
    mov dx,offset dta
    int 21h
    
    ; FindFirstFile
    mov ah,4eh
    xor cx,cx
    mov dx,offset searchPath
    int 21h
    jc quit

print_filename:
    ; имя файла находится по смещению 1Eh в DTA и завершается нулем
    ; теперь выводим имя найденного файла. сразу отмечу, чтобы не тратить время на
    ; красивый вывод делаю так: имя файла - последнее поле в DTA, поэтому ставлю 
    ; после DTA символ конца строки DOS "$" и вывожу как строку.
    mov ah,9
    mov dx,offset dta + 1eh
    int 21h
    
    ; FindNextFile
    mov ah,4fh
    mov dx,offset dta
    int 21h
    jnc print_filename    

quit:
    ; эникей
    xor ax,ax
    int 16h
    
    mov ah,4ch
    int 21h

; data    
searchPath	db "*.*",0
dta		db 2ch dup (?)
		db "$"
end start
Если нужна более подробная информация по DTA - спрашивай.
Вообще-то у меня где-то валяется куча всякой документации в электронном виде, надо наверное как-то ее выложить с благословления администрации :)
*provided AS IS
Vano
Сообщения: 41
Зарегистрирован: 16 авг 2004, 22:21
Откуда: Днепропетровск
Контактная информация:

Спасибо у меня всё получилось :) !!
Вот кусок моего кода:

Код: Выделить всё

//в сегменте данных я объявляю область для DTA
DTA DB 128 dup(0)
........................
//затем с помощью функции 1ah (int 21H) устанавливаю область DTA
mov ah, 1ah
lea dx, DTA
int 21h
//а так я вывожу нужную инфу на экран
mov ax,1301h
mov bh, 0        ;page
mov bl, 07h      ;color
mov cx, 11       ;count
mov dh, 0        ;numrow
mov dl, 0         ;numcolum
mov bp, offset DTA+1eh
int 10h
І усе працює !! :)
Zueuk
Сообщения: 1
Зарегистрирован: 12 май 2011, 16:45

Andy писал(а): Если нужна более подробная информация по DTA - спрашивай.
Вообще-то у меня где-то валяется куча всякой документации в электронном виде, надо наверное как-то ее выложить с благословления администрации :)

Конечно! Было бы хорошо. Информация лишней не бывает. Или в личку, если возможно ;)
Ответить