11

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

4

2 回答 2

18

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

于 2010-10-27T09:05:46.467 回答
10

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

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

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

于 2010-10-27T09:11:49.987 回答