Assembly 为什么';t使用此程序集代码删除带“quot;的文件;。lnk“;分机?

Assembly 为什么';t使用此程序集代码删除带“quot;的文件;。lnk“;分机?,assembly,x86-16,file-management,emu8086,Assembly,X86 16,File Management,Emu8086,我正在尝试使用assembly 8086体系结构删除扩展名为“.lnk”的文件。当我在“mov si,dx”之后写“jmp DELETE”并跳过内部、back1、back2、back3部分时,我的代码会删除所有文件,但当它逐个字符检查扩展名是否为.lnk时,它不会删除任何文件,甚至是扩展名为.lnk的文件。为什么会这样 .MODEL SMALL .STACK 100H .DATA FILE DB "*", 0 DTA DB 128H DUP(?) FILENAME DB 50 DUP(?)

我正在尝试使用assembly 8086体系结构删除扩展名为“.lnk”的文件。当我在“mov si,dx”之后写“jmp DELETE”并跳过内部、back1、back2、back3部分时,我的代码会删除所有文件,但当它逐个字符检查扩展名是否为.lnk时,它不会删除任何文件,甚至是扩展名为.lnk的文件。为什么会这样

.MODEL SMALL
.STACK 100H
.DATA
FILE DB "*", 0
DTA DB 128H DUP(?)   
FILENAME DB 50 DUP(?)
.CODE

MAIN PROC  

    MOV AX,@DATA
    MOV DS,AX

    ;SET DTA
    MOV DX,OFFSET DTA
    MOV AH,1AH
    INT 21H

    ;FIRST SEARCH
    MOV DX,OFFSET FILE 
    MOV CX,0
    MOV AH,4EH
    INT 21H
    JC QUIT

OUTER_LOOP:


    ;DELETE
    LEA DX,DTA+30 
    mov si, dx 

    inner:
    cmp [si], 0
    je back1
    inc si
    jmp inner

    back1:
    dec si
    cmp [si],'K'
    je back2
    jmp NEXT

    back2:
    dec si
    cmp [si],'N'
    je back3
    jmp NEXT

    back3:

    dec si
    cmp [si], 'L'


    delete:
    LEA DX,DTA+30 
    MOV AH,41H
    INT 21H


    ;INITIATE NEXT SEARCH
    NEXT:
    MOV DX,OFFSET FILE 
    MOV CX,0
    MOV AH,4FH
    INT 21H
    JC QUIT

    JMP OUTER_LOOP



QUIT:
    MOV AX,4C00H
    INT 21H

MAIN ENDP
    END MAIN

您可能会对以下几点感兴趣:

  • 将文件掩码更改为

    *.*
    
  • 你为什么要设置这么大的DTA

    DTA 44 dup(?)
    
  • 始终写入
    cmp字节ptr[si],…

  • 不要在3个字符后停止比较。添加第四个比较以查看该点是否存在。然后你就会知道LNK确实是一个文件扩展名

  • 您的4Fh DOS呼叫不需要CX和DX参数

  • 你不能解释结果

    cmp [si], 'L'
    

您使用的是什么汇编程序,出于好奇,它是否碰巧抛出了任何警告(masm或tasm?)?我希望大多数汇编器会抱怨所有看起来类似于这个
cmp[si],“L”
的行。一些汇编器会将其视为在[si]处比较16位字,而不是字节。所有像
cmp[si],'L'
(其中4行)应该像
cmp byte ptr[si],'L'
我使用的是tasm汇编器。现在我只是在一个名为“emu8086”的模拟器中运行我的代码。啊,emu8086是另一个野兽。我甚至不知道如何删除一个文件,或者模拟操作系统如何处理这个文件。你是说在EMU8086下运行时不能删除文件?我这样问是为了在必要时能重新回答你的问题。你说的我都做了。但还是不行/尝试用程序删除其他类型的文件(*.MY)。可能扩展名为.LNK的文件正在被emu8086使用,因此受到保护。@user3144770:您是否考虑过文件名在emu8086中可以是大写和小写?您要查找的文件是否可能是
lnk
而不是
lnk
?然后您有效地要求清除整个目录,因为代表每个文件的*通配符。@MichaelPetch和用户harmione为了解决此问题并简化您的程序,为什么不使用*.lnk的文件掩码?找到的每个文件(如果有)都将满足要求。