为什么函数参数按从右到左的顺序被压入堆栈?
答案 0 :(得分:16)
使用可变数量的参数(如printf)启用函数的存在。该函数可以提取前一个或两个参数,然后使用它们的值来推断堆栈上的参数总数。
答案 1 :(得分:8)
唯一的原因是可变函数:从堆栈中弹出的第一个参数是函数的“已知”参数,它可以从中确定它应该从堆栈中读取多少个其他参数。
请注意,为了使其工作正常,在这样的调用约定中,堆栈清理留给调用者,它知道它在堆栈上推送了多少个参数。这比callee-cleanup效率稍差,因为清理代码必须在每次函数调用之后写入,而在调用不允许可变参数函数的约定时,它可以嵌入到每个函数的末尾。
除此之外,没有特别的理由,实际上有几个调用约定(例如Pascal,Borland Fastcall)不允许可变参数函数并从左到右推送参数。