函数调用规范

函数调用规范是指进行一次函数调用时所采用的传递参数的方法,返回值的处理以及调用堆栈的清理.
Microsoftc/c++语言中采用了五中调用规范,分别是_cdecl,_stdcall,_fastcall,thiscall和nake.
每一种调用都是利用eax返回,如果函数返回值是64位的,则利用edx:eax返回.

 

各种调用规范的参数传递方法和调用堆栈清理如下:

_cdecl  堆栈清理者(调用者)  参数传递顺序(从右至左)

_stdcall  堆栈清理者(被调用者)  参数传递顺序(从右至左)

_fastcall  堆栈清理者(被调用者)  参数传递顺序(从右至左,前两个参数由ecx,edx传递)
thiscall  堆栈清理者(被调用者或调用者)  参数传递顺序(从右至左)
  

各种调用规范的用途如下:
_cdcel由于是调用者清理堆栈,所以可用来处理可变参数.
_stdcall是在windows程序设计中出现最多的调用规则,所有的不可变参数的API调用都使用这个规则.
_fastcall在windows内核设计中被广泛使用,由于两个参数由寄存器直接传递,采用这种规则的函数效率很高.
thiscall是c++成员函数的默认调用规范.编译期间,这种调用会根据参数是否支持可变参数表来决定采用什么方式清理堆栈.
如果成员函数不支持可变参数,那么它就是用参数入堆栈,ecx保存this指针的方式进行调用,如果成员函数支持可变参数,那么它的调用和_cdecl类似,唯一不同的是将this指针最后压入堆栈中进行传递.

你可能感兴趣的:(基础知识)