x64调用约定

x64网上说rcx,rdx,r8,r9,堆栈,但实际上,堆栈必须预留够相应的参数大小。比如传入rcx,rdx两个参数,则调用入口(call指令处rsp)必须上面要留2个寄存器大小的地址。而超过的部分,也就是需要用堆栈来传递的部分,则从调用入口处向上偏移4个处传递。也就是说前4个参数虽然用寄存器,但是堆栈的位置必须预留出来,以便于函数体内调用。难怪现在gcc编译出来的代码不使用压栈方式,而是直接改堆栈数据了。

以上研究结果来自于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

 

转载于:https://my.oschina.net/u/1777508/blog/1828739

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值