X64编程总结

X64编程和X86还是有一些不同的地方,总结一下日常用到的东西,便于以后查看:

1. 调用约定

        调用约定对于函数调用有影响,不同的函数调用,在汇编中会因为函数调用后栈不平衡而崩溃,在C/C++语言中如果使用函数指针或以函数作为参数,造成调用栈的不平衡而崩溃。函数调用方式,说到底是函数调用栈不同。

        X86的函数调用方式主要有:stdcall / cdecl / fastcall / thiscall / naked call 等几种形式。简单说一下几种调用方式有何不同,以与X64进行区分:

        stdcall :标准调用方式,Windows API / 函数做参数 一般采用这种方式,从右向左依次压栈函数参数,由被调用者清理调用堆栈。

        cdecl:C语言的调用方式,printf 是典型的cdecl调用方式的函数,参数数目可变。从右向左依次压栈,由调用者自己清理调用堆栈。(之所以调用者清栈,才可实现变参数)

        fastcall : 快速调用方式。最初两个参数,放入ecx,edx两个寄存器中,再有多余参数,按照从右向左依次压栈,由被调用者清理参数。

        thiscall :C++的类成员的调用方式,默认使用ecx 传递 this 指针,其他的参数按照stdcall的方式传参和清理调用栈。

        naked call : 这种方式不常用,表示该函数不需要编译器添加压栈与参数处理代码ÿ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值