2013-11-25 69 views
0

我試圖建立一個非常小的編譯器等,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 

當組裝時&鏈接打印正確世界,你好。 現在,當我有兩個打印語句,

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 

這將打印你好worldHey嘿!

我的問題是爲什麼是文字嘿!正在打印兩次。我究竟在做什麼 錯?如果它很重要,我使用NASM和MinGW(在Windows上)編譯此代碼

回答

1

您需要將字符串設爲ASCIIZ,即:在字符串後附加一個值爲0的字節。 printf()函數使用C風格的字符串。

所以DAT0指出的字符串確實是Hello worldHey!「Hey!」之後可能有一些零字節。分離可執行文件中的部分。

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