在程序集中列出目录内容?

时间:2012-12-09 13:06:36

标签: assembly x86 dos interrupt directory

我想打印当前的工作目录及其内容。该程序将在x86,16位Intel语法,DOS程序集中使用中断完成。我将使用的汇编程序将是Turbo汇编程序。到目前为止,这是我的代码(不多):

ASSUME  cs:code,    ds:data
data segment
buffer  db  64  dup  (0) ; buffer for the current directory name
data ends
code segment
start:
mov     ax,     data ;
mov     ds,     ax   ; move data segment into ds, es registers
mov     es,     ax   ;

mov     dl,     0             ; default drive 
mov     si,     offset buffer ; put current directory in buffer
mov     ah,     47h  ; GET CURRENT DIRECTORY
int     21h                  

; appending '$' to buffer end
    ; search until 0 found
mov     cx,     64  ; search over all buffer 
cld                                 ; starting from the beginning  
    end_string:                         
lodsb                               ; get current byte in al register
cmp     al,     0   ; compare it with 0
jne     continue                    ; if not equal jump to continue label
mov     al,     36  ; if equal copy 36('$' - ASCII) in al
mov     di,     si  ; set destination index to source index
sub     di,     1           ; decrement di 
stosb                               ; store in es:di the value contained in al
mov     cx,     1   ; stop looping by setting cx to 1
    continue: 
    loop end_string
    ; print string obtained 
mov     dx,     offset buffer  ; ds:dx - string start
mov     ah,     09h            ; WRITE STRING TO STANDARD OUTPUT
int     21h

mov     ax,     4c00h          ; end program with exit code 0
int     21h
    code ends
    end start   

我设法让它运行并显示当前的工作目录。但现在我不知道如何获取他的子目录和目录中包含的文件。所以我的问题是:我如何得到它们?

2 个答案:

答案 0 :(得分:1)

使用DOS服务FindFirst0x4e)和FindNext0x4f)获取给定目录中的条目列表。然后,您可以根据返回的属性区分子目录和文件。

答案 1 :(得分:1)

但在致电“FindNext”之前,请先获取DTA DTA - 磁盘传输区:http://stanislavs.org/helppc/dta.html

RBIL-> inter61b.zip-> INTERRUP.F

--------D-212F-------------------------------
INT 21 - DOS 2+ - GET DISK TRANSFER AREA ADDRESS
AH = 2Fh
Return: ES:BX -> current DTA
Note:   under the FlashTek X-32 DOS extender, the pointer is in ES:EBX
SeeAlso: AH=1Ah

德克