为什么调用者必须在 cdecl 调用约定中清除堆栈?

发布于 2024-08-07 07:46:58 字数 404 浏览 11 评论 0原文

来自: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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

圈圈圆圆圈圈 2024-08-14 07:46:58

因为,按照 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.

猫七 2024-08-14 07:46:58

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

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

It was right there on the wikipedia page above the _cdecl header

In these conventions the caller cleans the arguments from the stack, which allows for variable argument lists, eg. printf().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文