【问题标题】:Problems with outputting newline characters to a file将换行符输出到文件的问题
【发布时间】:2016-03-14 17:36:03
【问题描述】:

我正在编写一个 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

我正在使用 MASMDOSBOX。问题是程序虽然打印了两行不同的数据,但是在第2行之前,它还打印了一些奇怪的字符,然后打印了字符串msg。这个程序有什么问题,我该如何解决?

【问题讨论】:

  • 似乎您想要的字符串长度为 28 字节(十进制),并且您请求使用 mov cx,28h 写入 28 小时(十进制 40)字节。也许你的意思是mov cx,28
  • 我的错。我试试看。
  • 或者更好的是,在定义msg 之后立即使用msglength equ $-msg 指令让汇编器计算字符串的长度。
  • 当我在上面输入这条评论时,彼得提出了类似的建议。您可以让 TASM 为您计算字符串长度。将msglen equ $-msg 放在msg 的定义之后。这将计算msg 的大小(长度),然后您可以通过将mov cx, 28h 替换为mov cx, msglen 来利用该值。
  • 另一个特点。您似乎没有将换行符写入文件,而是将它们显示到控制台(int 21h/ah=2 显示到标准输出)。您不应该将它们写入文件吗?您可以使用 msg db 'Prashant Pandey 2014A7PS100G', 13, 10 之类的东西向 msg 本身添加换行符

标签: assembly dos masm dosbox x86-16


【解决方案1】:

您的代码中有几个问题。您的字符串 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 所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多