逆向工程核心原理——第十章

函数调用约定

函数调用约定,就是函数调用时如何传递参数的一种约定。

*栈的大小记录在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传参,而是直接使用寄存器传参。这样速度就比压栈传参更快。

原文地址:https://www.cnblogs.com/lex-shoukaku/p/13292515.html