2012-06-04 42 views
2

我看到了一個彙編代碼,它在調用一個函數之前從堆棧指針中減去,沒有任何特別的原因。減去的空間爲空,而不是使用:從堆棧指針減去對齊?

sub esp, 8 ; stack align 
push dword y 
push dword [x] 
call foo 
add esp, 16 
mov [x], eax 

代碼的作者添加的註釋「疊加對準」,但我不知道什麼是「疊對齊」的意思,也沒有如何做的命令sub esp, 8幫助實現它。

任何想法?

+0

請參閱http://stackoverflow.com/questions/612443/why-does-the-mac-abi-require-16-byte-stack-alignment-for-x86-32 –

+0

答案是「SSE要求他們的記憶操作數對齊到16字節邊界「。但該程序不使用SSE中介紹的任何指令。那麼對齊16字節堆棧的動機是什麼?除了上證所的要求之外,還有另外一個原因嗎? –

+1

即使沒有使用SSE指令,16字節對齊您的代碼和數據也是一個好主意。內存/高速緩存邏輯和指令預取都有好處,因爲它們可以保證內存請求只需單次讀取即可滿足。這是有道理的,因爲現代英特爾芯片的存儲器接口是64位寬和雙通道(16字節)。 – BitBank

回答

3

如果您的堆棧指針在輸入函數時與高速緩存線對齊,則執行這些函數可能會對緩存產生較小的壓力。

因此,可以組織一個編譯器系統來堅持讓函數在高速緩存行中與SP對齊輸入,並且編譯器知道每個調用位置使用了多少堆棧,在呼叫之前調整SP。

這會解釋你的例子。我還沒有看到許多編譯器實際上這樣做,因爲堆棧本身往往會以適度的距離增長/縮小,並且總體上不會因爲重複使用本地存儲而對緩存產生太多需求。

另一個用途是爲被調用者分配空間來工作,或者返回大於寄存器內容的結果。編譯器不會寫這樣的評論,所以有些人可能會這樣做。也許他知道他在做什麼;也許他沒有。如果被調用的函數不需要這個空間,那麼它只是一個浪費的指令。