cdecl和stdcall函数调用约定

1、cdecl主要用于c语言,调用者负责清理栈

源码:

#include "stdio.h"

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

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

载入OD调试,在调用完函数add()之后,由调用者main()函数清理栈,指令为:

add esp,0x8

调用add()时栈数据

2、stdcall主要用于win32 api,由被调用者清理栈,使用stdcall方式编译源码,方法是在调用函数前加_stdcall关键字即可

源码:

#include "stdio.h"

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

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

载入OD,在add()函数执行后,由add()函数清理栈,指令为:

retn 0x8

指令等同于:

retn + pop 0x8,返回地址并使esp值增加8个字节到原来大小

add()调用时栈数据

您可能还喜欢...