2016-08-09 30 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函数来跺跺栈值。

这甚至没有计算内嵌或其他优化魔术的可能性,因为事情可能并不是最终放在堆栈上的。

相关问题