use*_*849 6 c stack callstack function calling-convention
在C中进行函数调用时,参数以相反的顺序传递.这很重要,这样我们就可以访问第一个参数.而这一些如何支持varargs.我不明白即使你有权访问第一个参数,你仍然需要知道函数有多少个参数,否则你可能很容易忽略最后一个参数并开始将无效值视为参数.
如果参数count是必需的,那么以相反的顺序传递参数是没有意义的,因为你可以使用(sp - 2*number_of_arguments,sp = stack pointer)访问第一个参数.
以相反的顺序传递参数也应该有助于递归调用,我不明白如何.
先感谢您.
C没有定义参数传递的顺序.实际上,一些非常常见的调用约定(如x86-64 SYSV ABI)会传递寄存器中的前几个参数,而根本没有任何顺序.
但是,对于variable-argument-list函数来说,将参数从last到first推入堆栈是很常见的.这是因为为被调用函数发出的代码必须与传递的任意数量的附加参数一起使用.你是正确的,调用约定可以包括传递附加参数的数量 - 但以相反的顺序传递参数意味着这不是必需的,所以它是一个更简单的选项.你是正确的,在这种方案下很容易开始检查超出最后一个参数传递的值 - 例如,如果你printf()为给定的格式字符串传递不足的参数,就会发生这种情况.
具有固定数量参数的函数可以按任意顺序传递,实际上存在从左到右的调用约定(16位Windows API使用这样的调用约定).