Сборка, прерывание № 21, 4eh, 4fh проблема! - PullRequest
0 голосов
/ 13 апреля 2011

Может кто-нибудь сказать мне, как я могу использовать эти функции?int 21h, 4eh, 4fh ( в MS Dos )

Я хочу перечислить файлы и каталоги ... как мне это сделать?

Я бы хотел, чтобы кто-нибудь мог датьмне исходный код или пример int21h 4eh / 4fh ..

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Хм ... теперь вот какой-то древний код:

.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 голосов
/ 13 апреля 2011

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