我的程序要求读取文件名,然后它应该生成该文件的克隆,文件名为“Clone_originalfilename”。这是我的代码块:
.data
filename db 100
db ?
db 100 dup (0)
copyfile db "Clone_", 0
.code
mov dx, offset filename ; reads the filename entered by user
mov ah, 0Ah
int 21h
mov si, offset filename + 1 ; replaces the last character (Enter) to '$'
mov cl, [ si ]
mov ch, 0
inc cx
add si, cx
mov al, '$'
mov [ si ], al
; concatenate "Clone_" to the filename
lea si, filename
lea di, copyfile
L0:
cmp byte ptr [di], '_'
jz exL0
inc di
jmp L0
exL0:
inc di
add si, 2
xor bx, bx
L1:
cmp byte ptr [si], 0
jz exL1
mov bl, byte ptr [si]
mov byte ptr [di], bl
inc si
inc di
jmp L1
exL1:
inc di
mov bl, byte ptr [si]
mov byte ptr [di], bl
mov dx, offset filename
mov al, 2
mov ah, 3Dh
int 21h
mov handle, ax
jc erroropening
....
但是每当我执行它时,程序都会进入错误打开状态,显示文件无法读取,我认为问题在于字符串的连接但我不知道如何修复它。对不起,我是这里的新手。
答案 0 :(得分:3)
简短的片段中有很多错误。我们假设你忘了复制
.model small
.stack 1000h
和
.code
start:
END start
然后仍然是:
DS
没有初始化:
mov ax, @data
mov ds, ax
因此,至少lea di, copyfile
不会加载正确的地址。 filename
存储在错误的位置。
您没有“将”Clone_“连接到文件名”,反之亦然。为此,copyfile db "Clone_", 0
之后没有足够的空间。
用'$'替换输入的最后一个字符,但之后测试字符串为null(cmp byte ptr [si], 0
)。
在DOS环境中,只能使用8.3 filenames处理。我打赌你的文件名 Clone _... 太长了。
在offset filename
上,您找不到文件名,但是int 21h/ah=0Ah
的输入结构的开头。