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