我发现了一些让我感兴趣的东西,而且我没有找到答案......
va_arg \ va_start \ va_list \ va_end
宏如何在x64下工作?
在i386中调用约定会传递堆栈上的参数,因此宏只会增加一些指向堆栈基础的指针并转发它
但是在x64中,所有参数都通过寄存器传递....那么会发生什么?被调用函数如何知道哪些寄存器用于传递参数并且不会破坏它们....
答案 0 :(得分:1)
这是由体系结构的ABI定义的。在amd64的SysV ABI上(除了Windows之外的其他所有内容),ABI document说(第56页和前面):
采用变量参数列表并且已知调用宏va_start的函数的序言应该将参数寄存器保存到寄存器保存区域。
然后va_list
是一个带有指向寄存器保存区域的指针的结构,以及堆栈上可能已传递一些其他参数的位置(并非所有函数参数都适合寄存器)。