NASM程序集打印错误

时间:2013-11-25 23:08:48

标签: assembly x86 nasm

我正在尝试构建一个非常小的编译器,所以,

print "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

打印 Hello worldHey!嘿!

我的问题是为什么文字嘿!被打印两次。我究竟在做什么 错误?如果重要,我使用NASM和MinGW(在Windows上)编译了这段代码

1 个答案:

答案 0 :(得分:1)

你需要使你的字符串为ASCIIZ,即:在字符串后附加一个值为0的字节。 printf()函数使用C风格的字符串。

所以DAT0指向的字符串真的是Hello worldHey!可能在“嘿!”之后有一些零字节。分隔可执行文件中的部分。

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