Assembly MASM 8086在文本前胡言乱语

Assembly MASM 8086在文本前胡言乱语,assembly,macros,masm,Assembly,Macros,Masm,我正在学习汇编编程,并且已经开始使用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 l

我正在学习汇编编程,并且已经开始使用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

我使用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, "$"
对下列事项:

输出(一次固定):


正确的描述(或从终端窗口复制/粘贴文本)而不是仅仅说“奇怪的胡言乱语”,会让其他人更容易看到答案。我想你一定是在某个地方发生了指针错误,正在打印一些二进制数据,而不仅仅是覆盖普通的ASCII字符。我的问题不是文本“重写”本身,而是它将跳转到一个新行,打印一个箭头,一个ASCII标志,然后打印它(例如,我键入了“howdy”,它将[arrow][clover]howdy)除了DOSBox之外,我还在DOS6.22机器上运行了你的[更新的]MASM 6.15汇编程序,它运行起来没有问题。请提供以下信息:1>您使用的是什么版本的MASM?2> 您使用的链接器和版本是什么?3> 您使用的是什么版本的DOS?4> 您用来构建可执行文件的命令行是什么?
prompt db 13, 10, "Enter your string: $"
newl db 13, 10, "$"
C:\>dostest
Enter your string: howdy
howdy