Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 显示目录中最旧文件的名称_Assembly_Dos_X86 16_Tasm - Fatal编程技术网

Assembly 显示目录中最旧文件的名称

Assembly 显示目录中最旧文件的名称,assembly,dos,x86-16,tasm,Assembly,Dos,X86 16,Tasm,我有一个程序可以找到目录中最旧的文件。 但我无法保存文件名,无法显示它。 我不明白它能在哪里保存。我可以在dw中保存日期,但是如何保存文件名。 这是全部代码: .model small .stack 64 .data path db '*.*',0 dta db 256 DUP(?) er1 db "" Str db 'Successfully$',0 fdate dw 0FFFFH ftime dw 0FFFFH .code start: mov ax,@d

我有一个程序可以找到目录中最旧的文件。
但我无法保存文件名,无法显示它。 我不明白它能在哪里保存。我可以在dw中保存日期,但是如何保存文件名。 这是全部代码:

.model small
.stack 64
.data

path db '*.*',0

 dta  db 256 DUP(?)

er1 db ""

Str db 'Successfully$',0

 fdate   dw 0FFFFH   

 ftime dw 0FFFFH

.code

start:

mov ax,@data
mov ds,ax
xor ax,ax

mov ah,0    
mov al,2     
int 10h 


lea dx,dta       
mov ah,1AH        
int 21h           

mov ah,4EH        
lea dx,path       
mov cx,0          
int 21h           



lea bx,dta        
add bx,18h         
mov dx,[bx]
mov [fdate],dx

lea bx,dta        
add bx,16h         
mov dx,[bx]
mov [ftime],dx



NEXT_LINE:

lea bx,dta       
add bx,18h        
mov dx,[bx]

lea bx,dta       
add bx,16h         
mov cx,[bx]

cmp dx,[fdate] ; if dx < [fdate]
jc CompareDate



cmp dx,[fdate] if dx  = [fdate]
je CompareTime

back:

lea dx,path      
mov ah,4FH        
int 21h           
jc FINISHED      
jmp SHORT NEXT_LINE  

CompareDate:
mov fdate,dx   ; Save date 
mov ftime,cx   ; Save time

jmp back



 CompareTime:
 cmp cx,[ftime]
 jc Swap ;if cx < [ftime] : swap
 jmp back
 Swap:

 mov ftime,cx
 lea bx,dta        
 add bx,16h        
 mov dx,[bx]

 jmp back



FINISHED:

   ;Here I want to display a file name   

int 21h           
mov dx,offset Str
mov ah,09h
int 21h



mov dx,[fdate] ; For a debugger
mov cx,[ftime] ; For a debugger

mov ax,4c00h
int 21h
end start
。型号小
.堆栈64
.数据
路径数据库'*.*',0
dta db 256重复(?)
er1 db“”
Str db“已成功$”,0
fdate dw 0FFFFH
ftime dw 0FFFFH
.代码
开始:
mov-ax,@data
mov-ds,ax
xor ax,ax
莫夫啊,0
mov al,2
int 10h
lea dx,dta
mov-ah,1AH
int 21h
mov啊,4EH
lea dx,路径
mov-cx,0
int 21h
lea bx,dta
添加bx,18h
mov-dx[bx]
mov[fdate],dx
lea bx,dta
添加bx,16小时
mov-dx[bx]
mov[ftime],dx
下一行:
lea bx,dta
添加bx,18h
mov-dx[bx]
lea bx,dta
添加bx,16小时
mov cx,[bx]
cmp-dx[fdate];如果dx<[fdate]
jc比较
cmp dx,[fdate]如果dx=[fdate]
比较时间
背面:
lea dx,路径
mov-ah,4FH
int 21h
jc完成
jmp短下一行
比较:
mov-fdate,dx;保存日期
mov-ftime,cx;节省时间
jmp返回
比较时间:
cmp-cx[ftime]
jc掉期;如果cx<[ftime]:交换
jmp返回
互换:
mov-ftime,cx
lea bx,dta
添加bx,16小时
mov-dx[bx]
jmp返回
完成:
;这里我想显示一个文件名
int 21h
mov-dx,偏移量Str
mov啊,09h
int 21h
mov-dx[fdate];调试器
mov-cx[ftime];调试器
mov-ax,4c00h
int 21h
结束-开始

如果要保存多个值,必须使用循环。
8086
具有复制一组字节/字的简短形式:
rep movsb
(字节)和
rep movsw
(字)。我建议您将整个当前最旧的DTA(从FindNext获得)复制到“影子”DTA。最后,您将获得所有最旧文件的DTA,并最终可以计算其任何信息:

.MODEL small
.STACK 1000h

.DATA

    dta         db 128 DUP(?)
    dta_hold    db 128 DUP(?)
    path        db "*.*",0
    LF          db 13,10,'$'

.CODE

main PROC

    mov ax, @data
    mov ds, ax
    mov es, ax                  ; for movsw

    lea dx, dta                 ; dta: disk transfer area
    mov ah, 1AH                 ; SET DISK TRANSFER AREA ADDRESS
    int 21h                     ; DOS INTERRUPT

    mov ah, 4EH                 ; FIND FIRST MATCHING FILE
    lea dx, path                ; DS:DX -> ASCIZ file specification (may include path and wildcards)
    mov cx, 0                   ; file attribute mask
    int 21h                     ; DOS INTERRUPT

    call store_dta
    call print_filename         ; print the first filename

    FindNext:

    mov ah, 4FH                 ; FIND NEXT MATCHING FILE
    int 21h                     ; DOS INTERRUPT
    jc Finish

    ; compare filedates & filetimes
    lea si, dta_hold            ; DTA of the oldest file
    lea di, dta                 ; DTA of the just found file
    mov ax, [si+18h]            ; filedate
    mov bx, [di+18h]            ; filedate
    cmp ax, bx
    jc FindNext                 ; just found file is newer
    jne Older
                                ; filedates are identical
    mov ax, [si+16h]            ; filetime
    mov bx, [di+16h]            ; filetime
    cmp ax, bx
    jc FindNext

    Older:                      ; just found file is older
    call store_dta              ; copy dta to dta_hold
    jmp FindNext

    Finish:
    call print_filename         ; print the last filename
    mov ax,4c00h
    int 21h

main ENDP

store_dta PROC
    mov cx, (128/2)             ; size of DTA in WORDs (half of BYTEs)
    lea si, dta
    lea di, dta_hold
    rep movsw                   ; copy CX times DS:SI => ES:DI
    ret
store_dta ENDP

print_filename PROC
    lea di, dta_hold + 1Eh
    mov dx, di                  ; start of filename
    _B:                         ; look for NULL (ASCIZ-termination)
    cmp BYTE PTR [di], 0
    je _F
    inc di
    jmp _B
    _F:                         ; replace NULL by '$'
    mov [di], BYTE PTR '$'      ; end-of-string delimiter for INT 21h/09h
    mov ah, 09h                 ; WRITE STRING TO STANDARD OUTPUT
    int 21h                     ; DOS INTERRUPT
    lea dx, LF                  ; new line
    mov ah, 09h                 ; WRITE STRING TO STANDARD OUTPUT
    int 21h                     ; DOS INTERRUPT
    ret
print_filename ENDP

END main

也许你可以把它推到堆栈中,或者你只需要声明一些未初始化的内存,在那里你可以存储文件名谢谢。我在[mov[si+12]、“$”行上收到了关于问题的消息-“参数需要类型重写”。但我添加了“单词PTR”,一切正常。@user3672594:然后您使用了MASM。我根据你的标签为TASM写了程序。TASM和MASM之间的差别很小。@user3672594:我忘了:“BYTE PTR”更好。$'是一个单字节。我最早的文件名是'td.exe',但我收到'td.exe P TXT'。这正常吗?虽然对我来说没那么重要。@user3672594:不!这是不正常的!我想知道你为什么会得到更低的箱子。但我不能在这里重现这种行为。