前4个参数按顺序传递RCX,RDX,R8和R9。XMM0至XMM3用于传递浮点参数。
任何其他参数都在堆栈上传递。
大于64位的参数按地址传递。
溢出空间
即使函数使用少于4个参数,调用方也始终在堆栈上为4个QWORD大小的参数提供空间。被调用者可以随意将它们用于任何目的,通常将参数复制到那里,如果它们会被另一个调用所溢出。
对于标量返回类型,返回值放在RAX中。如果返回类型大于64位(例如,对于结构),则RAX是指向该类型的指针。
被调用者可以溢出用于参数传递的所有寄存器(RCX,RDX,R8,R9和XMM0至XMM3),RAX,R10,R11,XMM4和XMM5。所有其他寄存器都需要由调用方保留(例如,在堆栈上)。
堆栈必须保持16字节对齐。由于“ call”指令将一个8字节的返回地址压入,这意味着每个非叶函数都将以16n + 8形式的值来调整堆栈,以恢复16字节的对齐方式。
呼叫后,清理堆栈是呼叫者的工作。
来源:调用约定的历史,第5部分:amd64 Raymond Chen