1

我想打印当前工作目录及其内容。该程序将在 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   

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

4

2 回答 2

1

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

于 2012-12-09T13:37:29.070 回答
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

短剑

于 2014-01-07T07:42:10.713 回答