在 CDECL 调用约定中,我可以重用压入堆栈的参数吗?
In the CDECL calling convention, can I reuse the arguments I pushed onto the stack?
在 GCC cdecl
调用约定中,我能否保证调用返回后压入堆栈的参数相同?即使混合使用 ASM 和 C 并启用优化 (-O2
)?
一句话:没有
考虑这段代码:
__cdecl int foo(int a, int b)
{
a = 5;
b = 6;
return a + b;
}
int main()
{
return foo(1, 2);
}
这产生了这个 asm 输出(用 -O0 编译):
movl , 8(%ebp)
movl , 12(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
popl %ebp
ret
所以 __cdecl 函数很可能会破坏堆栈值。
这甚至还没有计算内联或其他优化魔法的可能性,在这些情况下,事情可能不会首先出现在堆栈上。
在 GCC cdecl
调用约定中,我能否保证调用返回后压入堆栈的参数相同?即使混合使用 ASM 和 C 并启用优化 (-O2
)?
一句话:没有
考虑这段代码:
__cdecl int foo(int a, int b)
{
a = 5;
b = 6;
return a + b;
}
int main()
{
return foo(1, 2);
}
这产生了这个 asm 输出(用 -O0 编译):
movl , 8(%ebp)
movl , 12(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
popl %ebp
ret
所以 __cdecl 函数很可能会破坏堆栈值。
这甚至还没有计算内联或其他优化魔法的可能性,在这些情况下,事情可能不会首先出现在堆栈上。