cdecl

cdecl是C语言中使用的调用方式,调用者负责处理栈

#include "stdio.h"

int add(int a,int b)
{
return (a+b)
}

int main(int argc, char *argv[]
{
return add(1,2);
})

在调用完add() 函数之后,使用 ADD ESP,8 命令整理栈。调用者 main() 函数直接清理其压入栈的函数参数,这样的方式叫 cdecl。

cdecl 调用的优点:可以向调用函数传递长度可变的参数,这种长度可变的参数在其他调用中很难实现。

stdcall

stdcll是 win32 API常用的调用方式,被调用者负责清理栈。

#include "stdio.h"

int _stdcall add(int a,int b)
{
return (a+b)
}

int main(int argc, char *argv[]
{
return add(1,2);
})

在调用add() 函数的最后,(40100A)的 RETN 8 命令整理栈,RETN 8 的含义为RETN+POP 8 字节,即返回后使ESP增加到知指定大小。

stdcall 调用的优点:被调用者函数内部存在着栈清理代码,代码的尺寸要小,WIN 32 使用这种方式,是为了更好的兼容性。

fastcall

fastcall 使用寄存器来传递给函数的参数。

fastcall 调用的优点:可以实现对函数的快速调用(调用前记得保存ECX和EDX中的重要数据)

2020-10-18

⬆︎TOP