Assembly 为什么';t使用此程序集代码删除带“quot;的文件;。lnk“;分机?
我正在尝试使用assembly 8086体系结构删除扩展名为“.lnk”的文件。当我在“mov si,dx”之后写“jmp DELETE”并跳过内部、back1、back2、back3部分时,我的代码会删除所有文件,但当它逐个字符检查扩展名是否为.lnk时,它不会删除任何文件,甚至是扩展名为.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(?)
.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'
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的文件掩码?找到的每个文件(如果有)都将满足要求。