可变参数和x64

时间:2016-10-24 10:29:43

标签: c x86-64 calling-convention variadic-macros

我发现了一些让我感兴趣的东西,而且我没有找到答案......

va_arg \ va_start \ va_list \ va_end宏如何在x64下工作? 在i386中调用约定会传递堆栈上的参数,因此宏只会增加一些指向堆栈基础的指针并转发它 但是在x64中,所有参数都通过寄存器传递....那么会发生什么?被调用函数如何知道哪些寄存器用于传递参数并且不会破坏它们....

1 个答案:

答案 0 :(得分:1)

这是由体系结构的ABI定义的。在amd64的SysV ABI上(除了Windows之外的其他所有内容),ABI document说(第56页和前面):

  

采用变量参数列表并且已知调用宏va_start的函数的序言应该将参数寄存器保存到寄存器保存区域。

然后va_list是一个带有指向寄存器保存区域的指针的结构,以及堆栈上可能已传递一些其他参数的位置(并非所有函数参数都适合寄存器)。