为什么有些字符显示在汇编代码中?

时间:2018-03-02 16:33:50

标签: assembly dos x86-16

我在程序集中写了一个简单的打印字符串(16位),但在运行.EXE代码后,它显示了我的字符串和很多字符,我不知道它们来自哪里。 ..

stk segment 
    dw 32 dup(0)
stk ends


dts segment 
msg db "hello world"
dts ends

cds segment 
    assume ss:stk , cs:cds , ds:dts
    main proc far

        mov ax,seg dts
        mov ds,ax
        mov dx,offset msg
        mov ah,09h
        int 21h 
        mov ah,4ch
        int 21 
        main endp
cds ends 
end main 

1 个答案:

答案 0 :(得分:2)

您已要求DOS打印您使用

定义的字符串
msg db "hello world"

您已为DOS提供了此字符串的开头(mov dx,offset msg),但 DOS无法知道字符串结束的位置。这就是需要用美元字符($)终止字符串的原因。然后DOS知道这是字符串的结尾。 DOS不会显示$本身。

msg db "hello world$"

或者如果您愿意清楚:

msg db "hello world", "$"

作为改进,您还可以打印换行符。将定义更改为:

msg db "hello world", 13, 10, "$"

ASCII代码13是回车,它将光标移到屏幕的左边缘,ASCII代码10是换行符,它将光标1行向下移动到屏幕上。
美元字符($)再次是字符串的最后一项。

mov ah,4ch
int 21

现在这可能只是一个错字,但它是一个重要的错误。你忘了十六进制后缀(h)。

mov ax,4C00h
int 21h