为什么调用者必须在 cdecl 调用约定中清除堆栈?
来自: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 以清除堆栈,因为被调用的函数应该将参数从堆栈中弹出,从而恢复堆栈指针...?
另一个问题:
理论上,可以实现可变参数函数,并由被调用者负责清理权(例如,如果您在寄存器中传递堆栈上的参数数量)?
From: 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
Why do we need to explicitly add 12 to ESP to clear the stack since the called function should have poped the parameters off the stack therefore restoring the stack pointer...?
Another question:
Theoretically, it would be possible to implement variable parameter functions with the callee taking care of the cleanup right (for instance if you pass the number of arguments on the stack in a register)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为,按照 C 调用约定,被调用的函数将不会弹出参数。这就是这个调用约定的要点。
它允许诸如可变参数之类的事情。
Because, with the C calling convention, the called function will not pop the parameters. That's the point of this calling convention.
It allows things like variable arguments.
它就在 _cdecl 标题上方的维基百科页面上
It was right there on the wikipedia page above the _cdecl header