MASM 8086 在文本前出现乱码

Posted

技术标签:

【中文标题】MASM 8086 在文本前出现乱码【英文标题】:MASM 8086 gibberish in front of text 【发布时间】:2016-09-19 22:27:33 【问题描述】:

我正在学习汇编编程,并且已经开始使用 MASM。我定义了一个用于打印的宏,另一个用于字符串输入。它似乎工作正常,但如果我使用宏,打印字符串将不起作用,我不知道为什么。

;Zanglang

.model small
.stack 200h

init macro
    mov ax, @data
    mov ds, ax
endm

fin macro
    mov ah, 04ch
    int 21h
endm

print macro str
    mov ah, 9h
    lea dx, str
    int 21h
endm

strinp macro

        mov ah, 0Ah
        mov dx, offset buff
        int 21h                 

        mov si, offset buff + 1
        mov cl, [ si ]          
        mov ch, 0               
        inc cx                  
        add si, cx            
        mov al, '$'
        mov [ si ], al            

        ;Print the value of buff
    print newl
    print buff + 2
    print newl

        ;This works!!!
    mov ah, 9h
        mov dx, offset buff + 2
        int 21h

endm



.data

prompt db 10, 13, "Enter your string: $"
newl db 10, 13, "$"

buff        db  26
        db  ?
        db  26 dup(0)

.code
start:

init

print prompt

strinp

fin
end start
end

【问题讨论】:

正确的描述(或从终端窗口复制/粘贴文本)而不是仅仅说“奇怪的胡言乱语”会使其他人更容易看到答案。我想你一定是在某个地方出现了指针错误,并且正在打印一些二进制数据,而不仅仅是覆盖普通的 ASCII 字符。 【参考方案1】:

我使用 MASM 6.15 组装您的示例,然后在 DOSbox 下运行二进制文件。

您的代码有效,但奇怪的行为源于您不正确的换行顺序。 DOS 需要 CRLF 而不是您所拥有的 LFCR。按照这个顺序,DOS 会忽略 LF (10),然后处理 CR (13)。一旦 DOS 处理了您的 CR,光标就会放在同一行的开头。然后您的输入字符串将打印在“输入您的字符串”提示的开头。要解决此问题,只需按如下方式反转换行符:

prompt db 10, 13, "Enter your string: $"
newl db 10, 13, "$"

以下内容:

prompt db 13, 10, "Enter your string: $"
newl db 13, 10, "$"

输出(一旦固定):

C:\>dostest
Enter your string: howdy
howdy

【讨论】:

我的问题不是文本“覆盖”本身,更多的是它会跳到一个新行,打印一个箭头,一个ASCII标志,然后打印它(例如,我输入了“你好”,它把[箭头] [三叶草]你好) 除了 DOSBox 之外,我还在一台 DOS 6.22 机器上运行了你的 [更新的] MASM 6.15 汇编程序,它运行没有问题。请提供以下信息: 1> 您使用的是什么版本的 MASM? 2> 您使用的链接器和版本是什么? 3> 你用的是什么版本的DOS? 4> 你使用什么命令行来构建可执行文件?

以上是关于MASM 8086 在文本前出现乱码的主要内容,如果未能解决你的问题,请参考以下文章

MASM:8086 中的 3X3 矩阵乘法有问题吗?

Qt界面显示乱码问题

上传的文本总出现乱码

8086汇编 程序编译

为啥在 Windows 上的 Chrome 或 Safari 上查看时,html 文本有时会出现乱码?

在 MASM 中调用宏