函数参数推送顺序
为什么函数参数按从右到左的顺序压入堆栈?
Why are function arguments pushed on the stack in right to left order?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
为什么函数参数按从右到左的顺序压入堆栈?
Why are function arguments pushed on the stack in right to left order?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
允许具有可变数量参数的函数的存在,例如 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.
唯一的原因是可变参数函数:从堆栈中弹出的第一个参数是该函数的“已知”参数,并且它可以从中确定应该从堆栈中读取多少其他参数。
请注意,为了使其正常工作,在这种调用约定中,堆栈清理工作留给调用者,调用者知道它在堆栈上推送了多少参数。这比被调用者清理效率稍低,因为清理代码必须在每个函数调用之后编写,而在不允许可变参数函数的调用约定中,它可以嵌入在每个函数的末尾。
除此之外,没有什么特别的原因,事实上有几种调用约定(例如 Pascal 、Borland 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.