2014-05-19 42 views
0

我正在使用16b程序集中的程序工作,该程序只是使用在运行时输入自己的文件名创建文件,然后关闭它。问题是 - 文件没有被创建。这里是我的代码:16b汇编 - 使用自定义文件名创建文件

org 100h 
mov ah, 9 
mov dx, prompt 
int 21h 

mov ah, 0ah 
mov dx, filename 
int 21h 

mov ah, 3ch 
mov cx, 0000h 
mov dx, filename+2 
int 21h 

mov word [filehandle], ax 

mov bx, [filehandle] 
mov ah, 3eh 
int 21h 


mov ah, 4ch 
int 21h 


prompt db "Filename:",10,13,"$" 
filename db 10 
     db 0 
     times 11 db "$" 
filehandle dw 0 

正如你所看到的,我正在使用缓冲输入读取文件名。不幸的是,该文件没有创建。它工作得很好,如果我硬编码的文件名,如:

... 

mov ah, 3ch 
mov dx, filename 
int 21h 

... 

filename db "test.txt" 

,但是这不是我想达到的目标。这段代码不起作用的原因是什么?我正在使用NASM。

编辑: 问题已解决,@rkhb的解决方案工作。

+0

尝试零终止您的文件名。 –

+0

@FrankKotler 您的意思是更改 次11 db“$” 至 次11 db 0 ? – Tomek

+0

您必须在8.3文件名后放置一个零字节。 filename db 10,db 0,times 11 db“$”,db 0,filehandle dw 0 –

回答

0

Int 21h/3Ch需要一个ASCIIZ字符串,即空终止,但Int 21h/0Ah给你0Dh(ENTER)作为终止。因此,您必须将0Dh更改为00h:

... 
mov ah, 0ah 
mov dx, filename 
int 21h 

movzx di, byte [filename+1] 
add di, filename+2 
mov byte [di], 0 

mov ah, 3ch 
mov cx, 0000h 
mov dx, filename+2 
int 21h 
...