将换行符输出到文件的问题
Problems with outputting newline characters to a file
我正在编写一个 DOS 程序来制作一个文件并写入其中。我必须在两行不同的行中写入数据。这是我的代码:
.model tiny
.486
.data
fname db 'file5.txt',0
handle dw ?
msg db 'Prashant Pandey 2014A7PS100G'
.code
.startup
mov ah,3eh
mov bx,handle
int 21h
mov ah,3ch ;the 4 lines from now open an new non-existing.3ch is used to open a new file
lea dx,fname
mov cl,2h
int 21h
mov handle,ax
mov ah,40h ;these 4 lines write to the already opened file
mov bx,handle
mov cx,28h
lea dx,msg
int 21h
; new line
mov dx,13
mov ah,2
int 21h
mov dx,10
mov ah,2
int 21h
mov ah,40h ;these 4 lines write to the already opened file
mov bx,handle
mov cx,28h
lea dx,msg
int 21h
mov ah,3eh
mov bx,handle
int 21h
.exit
end
我正在使用 MASM 和 DOSBOX。问题是虽然程序在不同的两行打印数据,但在第 2 行之前,它还打印了一些奇怪的字符,然后打印了字符串 msg。这个程序有什么问题,我该如何解决?
您的代码中有几个问题。您的字符串 Prashant Pandey 2014A7PS100G
的长度为 28 个字符,但是在写入文件时,您使用说明指定 28h(十六进制):
mov cx,28h
我想你是想使用 28 位小数。将上面匹配的两行修改为
mov cx,28
更好的解决方案是让汇编程序为您计算长度。这可以通过创建一个表示字符串长度的常量来完成。一个例子是在你定义 msg
:
之后写这个
MSGLEN equ $-msg
所以代码看起来像:
msg db 'Prashant Pandey 2014A7PS100G'
MSGLEN equ $-msg
$
相当于当前位置计数器。在用 msg db
定义字符串后,位置计数器将是 msg
最后一个字符后字节的位置。如果从中减去标签 msg
的地址,您将得到字符串的长度。 EQU 指令有效地创建了一个常量值,然后您可以在代码中使用该值。现在你可以像这样使用它了:
mov cx, MSGLEN
现在您可以修改 msg
字符串,而不必担心在代码中手动调整大小。
您的代码的第二个问题是 INT 21h/AH=2h 写入标准输出(如果您不将其重定向到其他地方,则默认写入控制台)。您的代码将换行符写入标准输出而不是文件。您可以通过使用以下代码将换行符添加到 msg
本身来解决该问题:
msg db 'Prashant Pandey 2014A7PS100G',13,10
MSGLEN equ $-msg
或者,您可以定义另一个包含 13,10
的字符串,并使用 INT 21/AH=40h 将其写出,就像您对 msg
.
所做的那样
我正在编写一个 DOS 程序来制作一个文件并写入其中。我必须在两行不同的行中写入数据。这是我的代码:
.model tiny
.486
.data
fname db 'file5.txt',0
handle dw ?
msg db 'Prashant Pandey 2014A7PS100G'
.code
.startup
mov ah,3eh
mov bx,handle
int 21h
mov ah,3ch ;the 4 lines from now open an new non-existing.3ch is used to open a new file
lea dx,fname
mov cl,2h
int 21h
mov handle,ax
mov ah,40h ;these 4 lines write to the already opened file
mov bx,handle
mov cx,28h
lea dx,msg
int 21h
; new line
mov dx,13
mov ah,2
int 21h
mov dx,10
mov ah,2
int 21h
mov ah,40h ;these 4 lines write to the already opened file
mov bx,handle
mov cx,28h
lea dx,msg
int 21h
mov ah,3eh
mov bx,handle
int 21h
.exit
end
我正在使用 MASM 和 DOSBOX。问题是虽然程序在不同的两行打印数据,但在第 2 行之前,它还打印了一些奇怪的字符,然后打印了字符串 msg。这个程序有什么问题,我该如何解决?
您的代码中有几个问题。您的字符串 Prashant Pandey 2014A7PS100G
的长度为 28 个字符,但是在写入文件时,您使用说明指定 28h(十六进制):
mov cx,28h
我想你是想使用 28 位小数。将上面匹配的两行修改为
mov cx,28
更好的解决方案是让汇编程序为您计算长度。这可以通过创建一个表示字符串长度的常量来完成。一个例子是在你定义 msg
:
MSGLEN equ $-msg
所以代码看起来像:
msg db 'Prashant Pandey 2014A7PS100G'
MSGLEN equ $-msg
$
相当于当前位置计数器。在用 msg db
定义字符串后,位置计数器将是 msg
最后一个字符后字节的位置。如果从中减去标签 msg
的地址,您将得到字符串的长度。 EQU 指令有效地创建了一个常量值,然后您可以在代码中使用该值。现在你可以像这样使用它了:
mov cx, MSGLEN
现在您可以修改 msg
字符串,而不必担心在代码中手动调整大小。
您的代码的第二个问题是 INT 21h/AH=2h 写入标准输出(如果您不将其重定向到其他地方,则默认写入控制台)。您的代码将换行符写入标准输出而不是文件。您可以通过使用以下代码将换行符添加到 msg
本身来解决该问题:
msg db 'Prashant Pandey 2014A7PS100G',13,10
MSGLEN equ $-msg
或者,您可以定义另一个包含 13,10
的字符串,并使用 INT 21/AH=40h 将其写出,就像您对 msg
.