X64编程总结

本文总结了X64编程与X86的区别,重点介绍了X64的调用约定,包括RCX、RDX、R8、R9用于整数和指针参数,浮点数通过XMM寄存器传递,调用者负责清理参数。函数调用栈需16字节对齐,部分寄存器在函数间易变,需注意保存。
摘要由CSDN通过智能技术生成

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 : 这种方式不常用,表示该函数不需要编译器添加压栈与参数处理代码ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值