概述
80x86 函数调用约定,主要是 cdecl 、stdcall 、fastcall、thiscall
函数调用约定通常规定一下内容:
参数的传递方式和传递顺序
规定参数以何种方式和顺序传递
栈的维护方式
规定是由调用函数还是被调用函数负责将参数清理出栈
产生函数修饰名的方法
在编译程序时,编译器为了区分不同的函数或方法,对函数或方法名进行修饰。
cdecl
C/C++语言默认的调用方式。
传递顺序:从右到左 顺序入栈
栈维护方式:调用者清除参数,被称为手动清栈,返回值在EAX中
函数名修饰方法:使用_作为前缀,
stdcall
Win32API 的调用方式
传递顺序:从右到左 顺序入栈
栈维护方式:被调用函数在返回后清栈,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。
fastcall
MicroSoft 专用,改约定只适用于x86 cpu
传递顺序:自作向右,前两个DWORD 值或更小变量在 ECX 和 EDX 中其他参数在堆栈上,自右向左传递
栈维护方式:被调函数被在返回前,清除栈中参数。
thiscall
c++ 类中默认的函数方法调用方式,只适用于c++。
传递顺序:thiscall调用约定函数参数按照从右向左的顺序入栈。若参数数目固定,则类实例的this指针通过ECX寄存器传递给被调函数。若参数数目不定,则this指针在所有参数入栈后再入栈,主调函数清理堆栈。
栈维护方式:被调函数自身清理堆栈;
Author: 哒琳
Permalink: http://blog.jieis.cn/2021/cccf0b22-653c-48ea-ad95-457354c1bcf1.html
Comments