一、在win32下,有cdecl/stdcall/fastcall等多種調用方式。在win64下,已經統一了。linux
二、win64下,函數調用時,前四個參數老是經過寄存器傳遞,剩餘的壓入堆棧。前四個參數雖然不壓入堆棧,但仍然會在堆棧上保留空間,叫shadow space。(Linux下前6個由寄存器保存,用rsi,rdi,rcx,rdx,r8,r9,好像也沒有shadow space)函數
三、前四個存入寄存器的參數,按照整數仍是浮點數,有所不一樣,整數用rcx,rdx,r8,r9,浮點數用xmm0,xmm1,xmm2,xmm3。當參數既有整數又有浮點時,按位置,如第二個參數,若是是整型,就放入rdx,若是是浮點就放入xmm1。(對比:linux x64下用RDI, RSI, RDX, RCX, R8, R9 and XMM0-XMM7 傳送參數,前6個參數存入寄存器,當參數既有整數又有浮點時,第一個出現的整數放入RDI,不管它出現的位置在哪,即便前面已經有5個浮點數了。)spa
四、Win64函數分爲內部會調用其它函數的幀函數和內部不調用其它函數的頁函數。頁函數能夠沒有幀指針(Frame Pointer)。幀函數分爲靜態分配棧空間與動態分配棧空間兩種,對於前一種因爲棧指針是固定的,能夠沒有幀指針,對於後一種,則有幀指針。指針
五、棧回溯在棧上找函數返回地址,肯定父函數時,多是須要藉助PDB中的調試信息。調試