2011-12-12 49 views
3

我最近在我的一個程序集文件的頂部看到了這一點,並意識到我花了很多年在打印整數的過程中使用它,卻沒有真正意識到它在哪裏來自原來(在我的基本組件模板中使用),或者什麼10,0就結束意味着:程序集中的intfmt:db「%d」,10,0的含義

section .data 
    intfmt: db "%d", 10, 0 

誰能打破這和解釋不同的組件,具體的行2?

我現在正在嘗試使用scanf讀取輸入,並且看起來此格式對此無法正常工作。想想現在是我學習數字意味着什麼的時候了!另外,如果您對使用scanf的64位體系結構的輸入讀取有任何想法,我之前沒有這樣做過,並且這導致了一些問題,因此任何指向這樣做的指針也將被讚賞!

+0

這是哪種體系結構?您應該在此標記它,因爲每個體系結構都有自己的機器/彙編語言,甚至在特定的體系結構中,可能會有許多彙編語法取決於使用的彙編程序。 –

+0

格式化字符串和其他只讀數據應放在'.rodata'部分,因此他們可以將其他只讀數據放入映射共享的頁面中,而不是私人的。 –

回答

5

intfmt:是一個標籤 - 它可以是任何字符串,但其他代碼引用它。

db是「define bytes」僞指令。它不會彙編機器代碼指令,而是將原始字節轉儲到代碼流(在這種情況下是.data節)。

"%d", 10, 0是要轉儲到流中的字節。第一個是ascii字符串,它轉儲兩個字節(字符'%'和'd'),10是換行符(C中的\n),0是空字節。

請注意,該字符串是一個原始字符串 - NOT nul終止,並且不支持任何C樣式轉義(如換行的\n)。因此,總體而言,這會產生與C語言字符串「%d \ n」等同的換行符和NUL終止符。

現在至於爲什麼這適用於printf而不適用於scanf(以及爲什麼那些開關如果你刪除了10)與printf和scanf的工作方式以及換行符的含義有什麼關係。

在printf中,換行符會打印一個換行符,然後(如果輸出處於行緩存模式,可能是這種情況)刷新內部輸出緩衝區,以便實際查看結果。所以當你移除10時,沒有沖洗,你看不到輸出。

在scanf中,換行符的意思是「讀取並丟棄字符,直到達到非空白字符」,並將該字符作爲下一個要讀取的字符。因此,如果你在終端輸入(例如)上執行scanf,換行符會導致它阻塞,直到在數字後面輸入非空行...

+0

優秀而全面的答案,謝謝! –