int x=CallFunc(2,3);
0040185B push 3 // 第二个参数3入栈
0040185D push 2 // 第一个参数2入栈
0040185F call @ILT+105(CallFunc) (0040106e) // 调用CallFunc
00401864 add esp,8 // VC编译器默认为__cdel传递方式,所以由调用者恢复堆栈
00401867 mov dword ptr [ebp-4],eax // 返回值eax放局部变量ebp-4
0040106E jmp CallFunc (004017f0)
int CallFunc(int x,int y)
104: {
004017F0 push ebp // 保存当前ebp
004017F1 mov ebp,esp // 调整ebp指向当前esp,用来寻址
004017F3 sub esp,40h
004017F6 push ebx
004017F7 push esi
004017F8 push edi
004017F9 lea edi,[ebp-40h]
004017FC mov ecx,10h
00401801 mov eax,0CCCCCCCCh
00401806 rep stos dword ptr [edi] // 堆栈初始化
105: return x+y; // 堆栈中从高到低依次为参数2/参数1/返回地址/当前ebp/局部变量1/局部变量2
00401808 mov eax,dword ptr [ebp+8] // 参数1放eax
0040180B add eax,dword ptr [ebp+0Ch] // 参数2与eax相加后返回到eax中
106: }
0040180E pop edi
0040180F pop esi
00401810 pop ebx
00401811 mov esp,ebp
00401813 pop ebp
00401814 ret