我正在尝试构建一个非常小的编译器,所以,
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上)编译了这段代码
答案 0 :(得分:1)
你需要使你的字符串为ASCIIZ,即:在字符串后附加一个值为0的字节。 printf()
函数使用C风格的字符串。
所以DAT0指向的字符串真的是Hello worldHey!
可能在“嘿!”之后有一些零字节。分隔可执行文件中的部分。
SECTION .data
DAT0:
db "Hello world",0
DAT1:
db "Hey!",0