2013-06-21 31 views
2

我想學習NASM大會(在Linux上,所以AT & T語法),但我堅持試圖通過系統調用打印「Hello World」。下面的代碼組裝並運行良好,但它不打印任何東西。任何線索爲什麼?爲什麼這個NASM組件不打印?

.text 
.globl main 

main: 
     movl $4, %eax 
     movl $1, %ebx 
     movl string1, %ecx 
     movl $20, %edx 
     int $0x80 

.data 
string1: .string "hello world" 

更新:我發現了它。我需要在「string1」前加上一個$符號,所以這一行變成了「movl $ string1,%ecx」。當我不包含它時會發生什麼情況的解釋?

+1

只是爲了清楚起見,這不是納斯姆。它是「AT&T語法」。天然氣使用它,Yasm將接受它作爲替代品,但不包括納斯姆... –

回答

1

您使用的系統調用需要一個指向ecx中字符串的指針。這就是添加$的做法 - 將的值string1納入ecx。如果您將$關閉,則可以將位於string1的第一個單詞放入ecx - 無論等效數字值爲hell。在一個帶有ASCII字符串的小端機器上(這應該是你的情況),這意味着你將0x6c6c6568放入ecx。這個值不太可能是指向任何類型字符串的有效指針,所以系統調用恰好不會打印任何東西。它可能很容易崩潰或導致一些其他類型的瘋狂行爲。