gpt4 book ai didi

assembly - 将换行符输出到文件时出现问题

转载 作者:行者123 更新时间:2023-12-02 19:29:35 24 4
gpt4 key购买 nike

我正在编写一个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。问题是,虽然程序在不同的两行中打印数据,但在第二行之前,它还打印了一些奇怪的字符,然后打印字符串 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 所做的那样写出来。

关于assembly - 将换行符输出到文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com