先来看一个简单的程序:
int func(int a, int b)
{
int c = 7;
c = a + b;
return c;
}
int main()
{
int x = 10;
int y = 20;
int z = 15;
z = func(x, y);
return 0;
}
在VC++6.0下,它对应的汇编代码为:
--- C:\Users\Administrator\Desktop\CPP\test.cpp ----------------------------------------------------------------------------------------------------------
1: int func(int a, int b)
2: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
3: int c = 7;
00401038 mov dword ptr [ebp-4],7
4: c = a + b;
0040103F mov eax,dword ptr [ebp+8]
00401042 add eax,dword ptr [ebp+0Ch]
00401045 mov dword ptr [ebp-4],eax
5: return c;
00401048 mov eax,dword ptr [ebp-4]
6: }
0040104B pop edi
0040104C pop esi
0040104D pop ebx
0040104E mov esp,ebp
00401050 pop ebp
00401051 ret
--- No source file ---------------------------------------------------------------------------------------------------------------------------------------
00401052 int 3
00401053 int 3
00401054 int 3
00401055 int 3
00401056 int 3
00401057 int 3
00401058 int 3
00401059 int 3
0040105A int 3
0040105B int 3
0040105C int 3
0040105D int 3
0040105E int 3
0040105F int 3
--- C:\Users\Administrator\Desktop\CPP\test.cpp ----------------------------------------------------------------------------------------------------------
7:
8: int main()
9: {
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,4Ch
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 lea edi,[ebp-4Ch]
0040106C mov ecx,13h
00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi]
10: int x = 10;
00401078 mov dword ptr [ebp-4],0Ah
11: int y = 20;
0040107F mov dword ptr [ebp-8],14h
12: int z = 15;
00401086 mov dword ptr [ebp-0Ch],0Fh
13: z = func(x, y);
0040108D mov eax,dword ptr [ebp-8]
00401090 push eax
00401091 mov ecx,dword ptr [ebp-4]
00401094 push ecx
00401095 call @ILT+0(func) (00401005)
0040109A add esp,8
0040109D mov dword ptr [ebp-0Ch],eax
14:
15: return 0;
004010A0 xor eax,eax
16: }
004010A2 pop edi
004010A3 pop esi
004010A4 pop ebx
004010A5 add esp,4Ch
004010A8 cmp ebp,esp
004010AA call __chkesp (004010d0)
004010AF mov esp,ebp
004010B1 pop ebp
004010B2 ret
单步调试了一下, 有不少收获和认识, 有兴趣的朋友, 也调试一下, 看看内存和寄存器的变化。
下面顺便附上一张网上的图, 跟我单步调试的结果一样:
不多说。