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