x64調用約定

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
相關文章
相關標籤/搜索