2016-05-16 117 views
0

我目前正在开发一个项目,并且需要将数字写入文件。这是我迄今为止所尝试的:写入程序集中的txt文件

keyHolder dw ? 
    filename db 'drawlog.txt',0 
    filehandle dw ? 
    ErrorMsg db 'Error', 13, 10,'$' 

proc OpenFile 
    mov ah, 3Dh 
    mov al, 2 
    mov dx, offset filename 
    int 21h 
    jc openerror 
    mov [filehandle], ax 
    ret 
    openerror: 
     mov dx, offset ErrorMsg 
     mov ah, 9h 
     int 21h 
     ret 
endp OpenFile 

proc closeFile 
    mov ah,3Eh 
    mov bx,[filehandle] 
    int 21h 
    ret 
endp closeFile 

proc writeKeyToFile 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 1 
    mov dx, offset keyHolder 
    int 21h 
    mov cx,1 
    mov ah, 40h 
    mov dl, 13 
    int 21h 
    mov cx,1 
    mov ah,40h 
    mov dl, 10 
    int 21h 
    ret 
endp writeKeyToFile 

该代码是有点工作,但有两件事我想问。首先,写入后文件包含应该写入的内容和其他奇怪的符号。其次,当我想要写入文件时,我该如何下线?

+0

请不要不断变化根据你得到的信息的问题。但是,只要你明确表明它确实是一个加法,你就可以加入这个问题。 – Fifoernik

回答

1

后写发生的文件包括什么应该被写入和其他怪异的符号

您指定的16个字节应该写(mov cx, 16 - 我假设这是DOS,虽然你别提)。您指定的地址只是一个2字节的变量。以下14个字节可能包含的值不是要写入文件。

如果keyHolder实际上表示一个字符串,请不要将其声明为“字”(dw) - 它是一个字节序列。 (你甚至可以确定2个字节就足以代表你正在编写的数字吗?)

第二件事是我怎么可以在我想要的时候下线(当写入文件的时候)

写一个回车+换行序列(CRLF;字节值13,然后是10)。

+0

非常感谢你,我玩了一下,所有的东西都在工作!谢谢! – Cake

+0

'dw'是“数据字”,16位。 'dd'是“数据双字”,'db'是“数据字节”。或者,也许最初的'd'代表定义,我不确定原点。无论如何,你可以可靠地确定'keyHolder'后面的字节内容,因为这是asm,紧接着是'filename'。 “变量”是一个高层次的概念。在asm中,只有内存或寄存器。但是,像MASM这样的一些汇编程序会根据标签之后的'db' /'dw' /'dd'来推断操作数的大小,但是,对于在内存地址中使用标签的指令来说。 –

+0

@PeterCordes是的,“无法可靠地确定”是一个错误的选择(现在重新措词)。因为我已经使用了MASM,并且大多数时候我都深入研究过程,至少32位,所以我对这些尺寸感到困惑,但是你当然是对的。奇怪的是,由于'filename'紧跟着'keyHolder'变量,我认为它会被写入文件而不是“怪异的符号”。我怀疑OP的粘贴代码不完整,并且其间还有其他变量。 – davmac

0

keyHolder未在您的代码中初始化。为了通过在文件中新的一行,声明这个变量:

newline db '\r\n' 

然后将其写入文件你写keyHolder后。因此,writeKeyToFile函数变为:

proc writeKeyToFile 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 16 
    mov dx, offset keyHolder 
    int 21h 
    mov ah, 40h 
    mov bx,[filehandle] 
    mov cx, 2 
    mov dx, offset newline 
    int 21h 
ret 
+0

感谢您的帮助,我得到了一切工作! – Cake

+2

@Cake:如果答案能够解决您的问题,您应该点击其中一个答案上的投票箭头下方的复选标记,将其标记为已接受。 –

+0

你说'newline'应该是''\ n''后面跟着0,并且这两个字节应该写入文件('mov cx,2')。但是在MS-DOS上,一个行结束序列通常是'\ r \ n'(13,10),当然不包括一个nul字节。 – davmac