文件未在masm32中打开

时间:2015-10-31 17:38:54

标签: assembly dos masm32 16-bit

我的程序要求读取文件名,然后它应该生成该文件的克隆,文件名为“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
....

但是每当我执行它时,程序都会进入错误打开状态,显示文件无法读取,我认为问题在于字符串的连接但我不知道如何修复它。对不起,我是这里的新手。

1 个答案:

答案 0 :(得分:3)

简短的片段中有很多错误。我们假设你忘了复制

.model small
.stack 1000h

.code
start:

END start

然后仍然是:

  1. DS没有初始化:

    mov ax, @data
    mov ds, ax
    

    因此,至少lea di, copyfile不会加载正确的地址。 filename存储在错误的位置。

  2. 您没有“将”Clone_“连接到文件名”,反之亦然。为此,copyfile db "Clone_", 0之后没有足够的空间。

  3. 用'$'替换输入的最后一个字符,但之后测试字符串为null(cmp byte ptr [si], 0)。

  4. 在DOS环境中,只能使用8.3 filenames处理。我打赌你的文件名 Clone _... 太长了。

  5. offset filename上,您找不到文件名,但是int 21h/ah=0Ah的输入结构的开头。