4
在GCC cdecl
调用约定中,我可以依赖在调用返回后我推入堆栈的参数是否相同?即使混合使用ASM和C并且启用了优化(-O2
)?在CDECL调用约定中,我可以重用我推入堆栈的参数吗?
在GCC cdecl
调用约定中,我可以依赖在调用返回后我推入堆栈的参数是否相同?即使混合使用ASM和C并且启用了优化(-O2
)?在CDECL调用约定中,我可以重用我推入堆栈的参数吗?
一句话:号
考虑以下代码:
__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函数来跺跺栈值。
这甚至没有计算内嵌或其他优化魔术的可能性,因为事情可能并不是最终放在堆栈上的。
对于C函数来说,修改它的非常量参数非常好,所以没有。 – Michael
@Michael:ABI没有提及任何关于'const'的参数。这是一个源代码级的编译时事情,不属于ABI。这很不幸,因为编译器似乎几乎没有利用通过参数的时隙作为临时空间,但总是假设数据被破坏了。 –