汇编 ? cdecl 函数调用约定,stdcall 函数调用约定

Posted whzym111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编 ? cdecl 函数调用约定,stdcall 函数调用约定相关的知识,希望对你有一定的参考价值。

知识点:
?  cdecl  函数调用约定
?  stdcall 函数调用约定
?  CALL堆栈平衡

配置属性--> c/c++ -->高级-->调用约定
一、cdecl调用约定
 VC++默认约定__cdecl
1、源代码
int  __cdecl  add1(int a,int b)
{
    return a+b;
}
2、生成汇编代码
00401000  /$  55            PUSH EBP
00401001  |.  8BEC          MOV EBP,ESP
00401003  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00401006  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]
00401009  |.  5D            POP EBP
0040100A  \.  C3            RETN                                     ;  POP EIP

3、调用代码
push b
push a
call add1
add esp,8
00401031  |.  6A 02         PUSH 2                                   ;  0012FF7C
00401033  |.  6A 01         PUSH 1
00401035  |.  E8 C6FFFFFF   CALL stdcall_.00401000                   ;  __cdecl add1
0040103A  |.  83C4 08       ADD ESP,8                                ;  RETN 8

二、stdcall调用约定
API函数约定 __stdcall
1、源代码
 int __stdcall add2(int a,int b)
{
    return a+b;
}

2、生成汇编代码
00401010  /$  55            PUSH EBP
00401011  |.  8BEC          MOV EBP,ESP
00401013  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00401016  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]
00401019  |.  5D            POP EBP
0040101A  \.  C2 0800       RETN 8                                   ;  RETN 8   //ADD ESP,8


3、调用代码
push b
push a
call add2
0040103D  |.  6A 04         PUSH 4                                   ;  0012FF7C
0040103F  |.  6A 03         PUSH 3
00401041  |.  E8 CAFFFFFF   CALL stdcall_.00401010                   ;  __stdcall add2 PUSH 下一个EIP

 

以上是关于汇编 ? cdecl 函数调用约定,stdcall 函数调用约定的主要内容,如果未能解决你的问题,请参考以下文章

调用约定_stdcall _cdecl _fastcall的区别

C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall

_STDCALL&_CDECL 调用约定

C++函数调用方式 stdcall pascal cdecl 总结

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.

三种函数调用约定