win64下的函数调用方式

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

转载于:https://my.oschina.net/u/136074/blog/686541

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值