64 位 Windows

参数

前 4 个参数传递(按顺序)RCX,RDX,R8 和 R9。XMM0 到 XMM3 用于传递浮点参数。

任何其他参数都在堆栈上传递。

大于 64 位的参数按地址传递。

溢出空间

即使函数使用少于 4 个参数,调用者也总是为堆栈上的 4 个 QWORD 大小的参数提供空间。被调用者可以出于任何目的自由使用它们,如果它们被另一个调用溢出,通常会复制那里的参数。

返回值

对于标量返回类型,返回值放在 RAX 中。如果返回类型大于 64 位(例如对于结构),则 RAX 是指向该类型的指针。

保存和 Clobbered 寄存器

参数传递中使用的所有寄存器(RCX,RDX,R8,R9 和 XMM0 至 XMM3),RAX,R10,R11,XMM4 和 XMM5 都可以被被调用者溢出。调用者需要保留所有其他寄存器(例如,在堆栈上)。

堆栈对齐

堆栈必须保持 16 字节对齐。由于调用指令推送一个 8 字节的返回地址,这意味着每个非叶函数将调整堆栈的形式为 16n + 8 的值,以便恢复 16 字节的对齐。
调用后清理堆栈是调用者的工作。

来源: 召集公约的历史,第 5 部分:amd64 Raymond Chen