Assembly NASM程序集打印错误

Assembly NASM程序集打印错误,assembly,x86,nasm,Assembly,X86,Nasm,我试图构建一个非常小的编译器 打印“Hello world” SECTION .data DAT0: db "Hello world" SECTION .text global _main extern _printf _main: push DAT0 call _printf add esp, 4 ret 0 正确组装和链接后,将打印Hello world。 现在,当我有两个打印语句时 print "Hello world" print "Hey!" 它产生: SECTION

我试图构建一个非常小的编译器

打印“Hello world”

SECTION .data
DAT0:
    db "Hello world"
SECTION .text
global _main
extern _printf

_main:
push DAT0
call _printf
add esp, 4

ret 0
正确组装和链接后,将打印Hello world。 现在,当我有两个打印语句时

print "Hello world"
print "Hey!"
它产生:

SECTION .data
DAT0:
    db "Hello world"
DAT1:
    db "Hey!"

SECTION .text
global _main
extern _printf

_main:
push DAT0
call _printf
add esp, 4

push DAT1
call _printf
add esp, 4

ret 0
这张照片显示了你好,世界嘿!嘿

我的问题是为什么文本正在打印两次。我到底在做什么
错了吗?如果有必要,我使用NASM和MinGW(在Windows上)编译了这段代码。

您需要将字符串设为ASCIIZ,即:在字符串后面附加一个值为0的字节。
printf()
函数使用C样式的字符串

所以DAT0所指的字符串实际上是
helloworldhey可能在“嘿!”之后有一些零字节来分隔可执行文件中的各个部分

SECTION .data
DAT0:
    db "Hello world",0
DAT1:
    db "Hey!",0