知识点: 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
三、fastcall 函数调用约定 直接用寄存器传递参数,由于寄存器相对于栈(存储器)速度要快上许多,所以这类的调用约定叫fastcall 1、源代码 int __fastcall add2(int a,int b) { return a+b; } 2、汇编代码 00401020 /$ 55 PUSH EBP 00401021 |. 8BEC MOV EBP,ESP 00401023 |. 83EC 08 SUB ESP,8 ; int a,b; 00401026 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX ; b=edx 00401029 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX ; a=ecx 0040102C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 0040102F |. 0345 F8 ADD EAX,DWORD PTR SS:[EBP-8] 00401032 |. 8BE5 MOV ESP,EBP ; add esp,8 00401034 |. 5D POP EBP 00401035 . C3 RETN 3、调用代码 00401096 |. BA 02000000 MOV EDX,2 0040109B |. B9 01000000 MOV ECX,1 004010A0 |. E8 7BFFFFFF CALL fastcall.00401020 ; 3