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()调用时栈数据