2016-01-27 81 views
0

是否有可能擴大這樣的棧幀:放大堆棧幀 - 對齊?

subq $1, %rsp 

,如果我們只是想存儲堆棧(例如)在char。 或者我們需要將堆棧放大8倍的倍數。有沒有對齊?

+1

技術上是的,但不要這樣做。如果您打算與其他代碼進行互操作,調用約定需要至少8個字節的對齊,可能是16個。錯位也涉及一些性能處罰。 – Jester

+0

有可能,x86對它並不是很挑剔。不要進行任何函數調用,錯位的堆棧會降低它們的速度。或者當它們包含SIMD代碼時使它們完全失效,越來越常見因爲不應該進行調用,所以在沒有調整堆棧指針4或8時沒有任何意義。 –

回答

4

簡而言之,「是的」。您可以按照您指定的方式精確放大堆疊框架。但是,如您在問題的其餘部分所述,您可能會遇到堆棧對齊問題。

這些問題很少會在您自己的代碼中造成問題。老實說,只要你沒有違反體系結構的限制,你可以用任何你想要的方式管理堆棧和傳遞參數。

但是,爲了與系統和庫調用進行互操作,堆棧對齊通常是必需的。您可能會發現this文檔很有用。舉一個例子,x86和x86_64上的Linux下的GCC期望(強制)堆棧的16字節對齊,並使用cdecl

您可能希望在參考文檔中找到您正在使用的平臺和庫的任何調用標準和對齊要求。

+2

您的意思是'cdecl'而不是'stdcall'。 – Jester

+0

嗯..哎呀!謝謝! –

+1

@ jester有一天我需要讓你進入聊天並找出你的背景。你的裝配知識真正廣泛而令人印象深刻。 :) –