先来看一个简单的程序:
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
单步调试了一下, 有不少收获和认识, 有兴趣的朋友, 也调试一下, 看看内存和寄存器的变化。
下面顺便附上一张网上的图, 跟我单步调试的结果一样:
不多说。