在 MSDOS 中,要求对方输入一个已有的文件名,然后将其删除
In MSDOS, ask the person to input an existing file name and then delete it
我写了下面的程序,但它不工作。我输入的文件名是 dur.txt
。它返回 AX=4C03。为什么它不起作用,我该如何纠正它?
.model tiny
.data
max1 db 32
act1 db ?
inp1 db 30 dup(0)
hande dw ?
.code
.startup
;enter the name of the file
lea dx,max1
mov ah,0ah
int 21h
;delete the file
mov ah,41h
lea dx, inp1
int 21h
.exit
end
正如 Michael 所说的那样,您按下的 [ENTER] 也存储在输入缓冲区中。您必须先将其替换为 0,然后才能调用 int 21/41
start:
;enter the name of the file
lea dx,max1
mov ah,0ah
int 21h
mov si,offset act1 ; inc si is coming before cmp, so start ahead
lookup:
inc si
cmp byte ptr [si],0Dh
jnz lookup
mov byte ptr[si],0
;delete the file
mov ah,41h
lea dx, inp1
int 21h
提示:如果你在比较之后"inc si",你会破坏它的标志设置。所以我将 inc si 移动到比较之前,并且 SI 必须在缓冲区之前加载一个字节。
ps:查找非常简单(而且很危险,它不会在内存中找到任何 0x0D 之前停止!),我很确定某处有一个 x86 循环指令:-)
迈克尔(再次)正确地(再次)陈述,输入缓冲区的第二个字节将告诉输入的字符串有多长(以及 0x0d 的位置,因为它是输入的最后一个字母)。所以不用找了,就在[inp1+[act1]]
start:
lea dx,max1 ;enter the name of the file
mov ah,0ah
int 21h
pick:
mov si,offset inp1 ; get offset of entered string
xor bh,bh
mov bl,[act1] ; and it's len (the CR should be there)
mov byte ptr [bx+si],0 ; replace it with a 0
mov ah,41h ;delete the file
lea dx, inp1
int 21h
我写了下面的程序,但它不工作。我输入的文件名是 dur.txt
。它返回 AX=4C03。为什么它不起作用,我该如何纠正它?
.model tiny
.data
max1 db 32
act1 db ?
inp1 db 30 dup(0)
hande dw ?
.code
.startup
;enter the name of the file
lea dx,max1
mov ah,0ah
int 21h
;delete the file
mov ah,41h
lea dx, inp1
int 21h
.exit
end
正如 Michael 所说的那样,您按下的 [ENTER] 也存储在输入缓冲区中。您必须先将其替换为 0,然后才能调用 int 21/41
start:
;enter the name of the file
lea dx,max1
mov ah,0ah
int 21h
mov si,offset act1 ; inc si is coming before cmp, so start ahead
lookup:
inc si
cmp byte ptr [si],0Dh
jnz lookup
mov byte ptr[si],0
;delete the file
mov ah,41h
lea dx, inp1
int 21h
提示:如果你在比较之后"inc si",你会破坏它的标志设置。所以我将 inc si 移动到比较之前,并且 SI 必须在缓冲区之前加载一个字节。 ps:查找非常简单(而且很危险,它不会在内存中找到任何 0x0D 之前停止!),我很确定某处有一个 x86 循环指令:-)
迈克尔(再次)正确地(再次)陈述,输入缓冲区的第二个字节将告诉输入的字符串有多长(以及 0x0d 的位置,因为它是输入的最后一个字母)。所以不用找了,就在[inp1+[act1]]
start:
lea dx,max1 ;enter the name of the file
mov ah,0ah
int 21h
pick:
mov si,offset inp1 ; get offset of entered string
xor bh,bh
mov bl,[act1] ; and it's len (the CR should be there)
mov byte ptr [bx+si],0 ; replace it with a 0
mov ah,41h ;delete the file
lea dx, inp1
int 21h