#assembly #file #dos #root #interrupt
#сборка #файл #dos #root #прерывание
Вопрос:
Может ли кто-нибудь сказать мне, как я могу использовать эти функции? int 21h, 4eh, 4fh (в MS Dos)
Я хочу перечислить файлы и каталоги… как мне это сделать?
Я хотел бы, чтобы кто-нибудь мог дать мне исходный код или пример int21h 4eh / 4fh ..
Заранее спасибо
Комментарии:
1. Почти все библиотеки / платформы имеют лучшие методы для получения файлов. Для чего программируется / for?
2. Я знаю, но я должен использовать сборку. мне это нужно для академического проекта.
Ответ №1:
Хм … теперь вот какой-то древний код:
.model small, c
.stack
.data
file_spec db "*.*", 0
DTA db 128h dup(0)
.code
main proc
mov ax, @Data
mov ds, ax
mov dx,offset DTA
mov ah,1Ah
int 21h
mov dx,offset file_spec
xor cx, cx
mov ah,4Eh
int 21h
jc quit
print_name:
lea si, DTA 1eh
next_char:
lodsb
int 29h
test al, al
jnz next_char
mov al, 13
int 29h
mov al, 10
int 29h
mov dx, offset file_spec
xor cx, cx
mov ah, 4fh
int 21h
jnc print_name
quit:
mov ax, 4c00h
int 21h
main endp
end main
Как вы можете видеть, в дни моей молодости я действительно верил во множество комментариев (хотя, я должен признать, что даже глядя на это сейчас, это не кажется особенно сложным для понимания).
Ответ №2:
Функция 4eh находит первый файл, соответствующий некоторым атрибутам, которые хранятся в cx
в соответствии со следующей схемой:
bit 0 = 1 read-only file
bit 1 = 1 hidden file
bit 2 = 1 system file
bit 3 = 1 volume (ignored)
bit 4 = 1 reserved (0) - directory
bit 5 = 1 archive bit
bits 6-15 reserved (0)
ds:dx
должен содержать адрес имени файла (завершающегося нулем) (разрешены подстановочные знаки). Так, например, чтобы перечислить все exes в c: , имя файла будет c:*.exe
.
При возврате, если флаг переноса установлен в 1, файлов не было, в противном случае DTA заполняется таким образом:
Offset Size in bytes Meaning
0 21 Reserved
21 1 File attributes
22 2 Time last modified
24 2 Date last modified
26 4 Size of file (in bytes)
30 13 File name (ASCIIZ)
Вы можете указать DOS, где вы хотите разместить DTA, с помощью этого простого фрагмента:
mov dx,OFFSET youChoose ; DS:DX points to DTA
mov ah,1AH ; function 1Ah - set DTA
int 21h ; call DOS service