1、在win32下,有cdecl/stdcall/fastcall等多种调用方式。在win64下,已经统一了。
2、win64下,函数调用时,前四个参数总是通过寄存器传递,剩余的压入堆栈。前四个参数虽然不压入堆栈,但仍然会在堆栈上保留空间,叫shadow space。(Linux下前6个由寄存器保存,用rsi,rdi,rcx,rdx,r8,r9,好像也没有shadow space)
3、前四个存入寄存器的参数,按照整数还是浮点数,有所不同,整数用rcx,rdx,r8,r9,浮点数用xmm0,xmm1,xmm2,xmm3。当参数既有整数又有浮点时,按位置,如第二个参数,如果是整型,就放入rdx,如果是浮点就放入xmm1。(对比:linux x64下用RDI, RSI, RDX, RCX, R8, R9 and XMM0-XMM7 传送参数,前6个参数存入寄存器,当参数既有整数又有浮点时,第一个出现的整数放入RDI,无论它出现的位置在哪,即使前面已经有5个浮点数了。)
4、Win64函数分为内部会调用其它函数的帧函数和内部不调用其它函数的页函数。页函数可以没有帧指针(Frame Pointer)。帧函数分为静态分配栈空间与动态分配栈空间两种,对于前一种由于栈指针是固定的,可以没有帧指针,对于后一种,则有帧指针。
5、栈回溯在栈上找函数返回地址,确定父函数时,可能是需要借助PDB中的调试信息。