函数调用约定
函数调用约定,就是函数调用时如何传递参数的一种约定。
*栈的大小记录在pe头中。
主要的函数调用约定如下:
cdecl
stdcall
fastcall
1.cdecl
cdecl主要是C语言中使用的方式,调用者负责处理栈。
这里书本上给了一段代码:
#include<stdio.h>
int add(int a, int b)
{
return (a+b);
}
int main()
{
return add(1,2);
}
编译后放进OD查看函数调用:
这种通过push指令将值压入栈中传递参数的方法,就是cdecl。
2.stdcall
stdcall这种方式常常用于Win32 API,这种方式由被调用者清理栈。
还是利用书上的代码:
#include<stdio.h>
int _stdcall add(int a, int b)
{
return (a+b);
}
int main()
{
return add(1,2);
}
还是使用OD工具查看:
我们看到与上面cdecl相比,缺少了一条关闭栈区的指令。因为stdcll是被调用者清理栈。
3.fastcall
fastcall与前面两个不一样的地方就是,fastcall不会使用push传参,而是直接使用寄存器传参。这样速度就比压栈传参更快。