Сборка, проблема с прерыванием # 21, 4eh, 4fh!

#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