函数参数推送顺序

发布于 2024-09-29 16:26:05 字数 27 浏览 8 评论 0原文

为什么函数参数按从右到左的顺序压入堆栈?

Why are function arguments pushed on the stack in right to left order?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(2

痴意少年 2024-10-06 16:26:05

允许具有可变数量参数的函数的存在,例如 printf。该函数可以提取前一个或两个参数,然后使用它们的值来推断堆栈上参数的总数。

To enable the existence of functions with a variable number of arguments, like printf. The function can extract the first one or two arguments and then use their values to deduce the total number of arguments on the stack.

初与友歌 2024-10-06 16:26:05

唯一的原因是可变参数函数:从堆栈中弹出的第一个参数是该函数的“已知”参数,并且它可以从中确定应该从堆栈中读取多少其他参数。

请注意,为了使其正常工作,在这种调用约定中,堆栈清理工作留给调用者,调用者知道它在堆栈上推送了多少参数。这比被调用者清理效率稍低,因为清理代码必须在每个函数调用之后编写,而在不允许可变参数函数的调用约定中,它可以嵌入在每个函数的末尾。

除此之外,没有什么特别的原因,事实上有几种调用约定(例如 PascalBorland Fastcall),不接受可变参数函数并将参数从左到右推送。

The only reason is for variadic functions: the first arguments popped from the stack are the "known" ones for the function, and it can determine from them how many other arguments it should read from the stack.

Notice that, for this to work fine, in such calling conventions the stack cleanup is left to the caller, that knows how many arguments it pushed on the stack. This is slightly less efficient than callee-cleanup, because the cleanup code has to be written after each function call, while in calling conventions that do not allow variadic functions it can be embedded at the end of each function.

Other than this, there's no particular reason, in facts there are several calling conventions (e.g. Pascal, Borland Fastcall) that do not admit variadic functions and push parameters left to right.

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