win64下的函数调用方式

一、在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中的调试信息。调试

相关文章
相关标签/搜索