2016-08-09 63 views
4

在GCC cdecl調用約定中,我可以依賴在調用返回後我推入堆棧的參數是否相同?即使混合使用ASM和C並且啓用了優化(-O2)?在CDECL調用約定中,我可以重用我推入堆棧的參數嗎?

+0

對於C函數來說,修改它的非常量參數非常好,所以沒有。 – Michael

+0

@Michael:ABI沒有提及任何關於'const'的參數。這是一個源代碼級的編譯時事情,不屬於ABI。這很不幸,因爲編譯器似乎幾乎沒有利用通過參數的時隙作爲臨時空間,但總是假設數據被破壞了。 –

回答

4

一句話:號

考慮以下代碼:

__cdecl int foo(int a, int b) 
{ 
    a = 5; 
    b = 6; 
    return a + b; 
} 

int main() 
{ 
    return foo(1, 2); 
} 

這產生該ASM輸出(用-O0編譯):

movl $5, 8(%ebp) 
movl $6, 12(%ebp) 
movl 8(%ebp), %edx 
movl 12(%ebp), %eax 
addl %edx, %eax 
popl %ebp 
ret 

所以,很可能一個__cdecl函數來跺跺棧值。

這甚至沒有計算內嵌或其他優化魔術的可能性,因爲事情可能並不是最終放在堆棧上的。

相關問題