X64调用规范

1.由于地址长度为64位,因此CALL指令把RSP(堆栈指针)寄存器的值减去8.
2.第一批传递子程序的四个参数依次存放于寄存器RCX、RDX、R8、R9。因此,如果只传递一个参数就会放到RCX寄存器中。如果还有第二参数就会将其放入RDX寄存器中,其他参数从右至左入栈。
3.长度不足64位的参数不进行零扩展,因此,其高位的值是不确定的。
4.如果返回值的长度小于或者等于64位,那么它必须放在RAX寄存器中。
5.主调者负责在堆栈中分配至少32字节的影子空间,以便被调用的子程序可以选择将寄存器的值保存在这个区域。
6.调用子程序时,堆栈指针(RSP)必须对齐16字节边界。CALL指令将8字节的返回地址压入堆栈,因此,主调程序除了把堆栈指针减去32以便存放寄存器参数外,还要减去8(本人注:所以写64位汇编的时候老是开栈28h,48h的).
7.被调用子程序执行结束后,主调程序需负责从运行时堆栈中移除所有的参数及影子空间(编译器为RC、RDX、R8、R9预留的空间)。
8.大于64位的返回值存放于运行时堆栈,由RCX指出其位置。
9.寄存器RAX、RCX、RDX、R8、R9、R10和R11常常被子程序修改,因此,如果主调程序想要保存他们的值,就应在调用子程序之前将它们入栈,之后再将其从堆栈中弹出。
10.寄存器RBX、RBP、RDI、RSI、R12、R13、R14和R15的值必须由子程序保存。

转载于:https://www.cnblogs.com/Toring/p/6682748.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值