在CDECL调用约定中,我可以重用我压入堆栈的参数吗?

bas*_*sdp 5 assembly gcc cdecl

在GCC cdecl调用约定中,在调用返回后,我可以依赖于推入堆栈的参数是否相同?即使混合ASM和C并-O2启用了optimization()?

Dav*_*erd 5

一句话:不.

考虑以下代码:

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

int main()
{
   return foo(1, 2);
}
Run Code Online (Sandbox Code Playgroud)

这产生了这个asm输出(用-O0编译):

movl    $5, 8(%ebp)
movl    $6, 12(%ebp)
movl    8(%ebp), %edx
movl    12(%ebp), %eax
addl    %edx, %eax
popl    %ebp
ret
Run Code Online (Sandbox Code Playgroud)

所以__cdecl函数很可能会踩到堆栈值.

这甚至没有计算内联或其他优化魔法的可能性,因为事情可能不会首先在堆栈上结束.