6

来自:http ://en.wikipedia.org/wiki/X86_calling_conventions

push c
push b
push a
call function_name
add esp, 12 ;Stack clearing
mov x, eax

为什么我们需要显式地将 12 添加到 ESP 以清除堆栈,因为被调用的函数应该已将参数从堆栈中弹出,从而恢复堆栈指针......?

另一个问题:

从理论上讲,有可能在被调用者负责清理权的情况下实现可变参数函数(例如,如果您在寄存器中传递堆栈上的参数数量)?

4

2 回答 2

19

因为,使用 C 调用约定,被调用的函数不会弹出参数。这就是这个调用约定的重​​点。

它允许变量参数之类的东西。

于 2009-10-08T17:01:15.357 回答
6

它就在 _cdecl 标题上方的维基百科页面上

在这些约定中,调用者从堆栈中清除参数,这允许变量参数列表,例如。打印函数()。

于 2009-10-08T17:07:18.323 回答