可变参数和 x64

DrP*_*tay 6 c x86-64 calling-convention variadic-macros

va_arg\ va_start\ va_list\va_end宏在 x64 中如何工作?

i386 中的调用约定在堆栈上传递参数,因此宏只是增加一些指向堆栈基址的指针并转发它。然而,在 x64 中,所有参数都是通过寄存器传递的......那么那里会发生什么呢?被调用函数如何知道哪些寄存器用于传递参数以确保它不会破坏它们?

Art*_*Art 4

这是由架构的 ABI 定义的。在 amd64 的 SysV ABI 上(除了 Windows 之外的几乎所有东西),ABI 文档说(第 56 页及以后):

采用可变参数列表并已知调用宏 va_start 的函数的序言预计会将参数寄存器保存到寄存器保存区域。

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

  • 可以在[此博客]中找到一些解释(https://blog.nelhage.com/2010/10/amd64-and-va_arg/) (4认同)