x64網上說rcx,rdx,r8,r9,堆棧,但實際上,堆棧必須預留夠相應的參數大小。好比傳入rcx,rdx兩個參數,則調用入口(call指令處rsp)必須上面要留2個寄存器大小的地址。而超過的部分,也就是須要用堆棧來傳遞的部分,則從調用入口處向上偏移4個處傳遞。也就是說前4個參數雖然用寄存器,可是堆棧的位置必須預留出來,以便於函數體內調用。難怪如今gcc編譯出來的代碼不使用壓棧方式,而是直接改堆棧數據了。c++
以上研究結果來自於delphi cpu調試。函數
後又通過使用vc++2015編寫x64DLL導出測試,跟delphi調試結果相同,並且不作堆棧平衡。由調用者在調用前分配好堆棧,相似於:測試
fmmain.pas.137: begin 00000000006FB090 55 push rbp 00000000006FB091 4883EC40 sub rsp,$40 00000000006FB095 488BEC mov rbp,rsp 00000000006FB098 48894D50 mov [rbp+$50],rcx 00000000006FB09C 48895558 mov [rbp+$58],rdx ... ... ... fmmain.pas.146: end; 00000000006FB0E8 488D6540 lea rsp,[rbp+$40] 00000000006FB0EC 5D pop rbp 00000000006FB0ED C3 ret