源码
#include<stdio.h> class CSoft { public: CSoft() { m_nColor = 2; } virtual ~CSoft() { printf("virtual ~CSoft()\n"); } virtual int GetColor() { return m_nColor; } virtual int SitDown() { return printf("Sit down and rest your legs!\n"); } protected: int m_nColor; }; class CBed { public: CBed() { m_nLength = 4; m_nWidth = 5; } virtual ~CBed() { printf("virtual ~CBed()\n"); } virtual int GetArea() { return m_nLength * m_nWidth; } virtual int Sleep() { return printf("go to sleep!\n"); } protected: int m_nLength; int m_nWidth; }; class CSoftBed : public CSoft , public CBed { public: CSoftBed() { m_nHeight = 6; } virtual ~CSoftBed() { printf("virtual ~CSoftBed()\n"); } virtual SitDown() { return printf("sit down on the soft bed\n"); } virtual int Sleep() { return printf("go to sleep on the sofa bed\n"); } virtual int GetHeight() { return m_nHeight; } protected: int m_nHeight; }; int main5() { CSoftBed softBed; CSoft *pSoft = &softBed; CBed *pBed = &softBed; pSoft->SitDown(); pBed->Sleep(); printf("Color = %d\n" , pSoft->GetColor()); printf("area = %d\n" , pBed->GetArea()); return 0; }反汇编分析
1: #include<stdio.h> 2: 3: class CSoft 4: { 5: public: 6: CSoft() 00402020 push ebp 00402021 mov ebp,esp 00402023 sub esp,44h 00402026 push ebx 00402027 push esi 00402028 push edi 00402029 push ecx 0040202A lea edi,[ebp-44h] 0040202D mov ecx,11h 00402032 mov eax,0CCCCCCCCh 00402037 rep stos dword ptr [edi] 00402039 pop ecx 0040203A mov dword ptr [ebp-4],ecx 0040203D mov eax,dword ptr [ebp-4] 00402040 mov dword ptr [eax],offset CSoft::`vftable' (0042610c) 7: { 8: m_nColor = 2; 00402046 mov ecx,dword ptr [ebp-4] 00402049 mov dword ptr [ecx+4],2 9: } 00402050 mov eax,dword ptr [ebp-4] 00402053 pop edi 00402054 pop esi 00402055 pop ebx 00402056 mov esp,ebp 00402058 pop ebp 00402059 ret 10: virtual ~CSoft() 11: { 00402070 push ebp 00402071 mov ebp,esp 00402073 sub esp,44h 00402076 push ebx 00402077 push esi 00402078 push edi 00402079 push ecx 0040207A lea edi,[ebp-44h] 0040207D mov ecx,11h 00402082 mov eax,0CCCCCCCCh 00402087 rep stos dword ptr [edi] 00402089 pop ecx 0040208A mov dword ptr [ebp-4],ecx 0040208D mov eax,dword ptr [ebp-4] 00402090 mov dword ptr [eax],offset CSoft::`vftable' (0042610c) 12: printf("virtual ~CSoft()\n"); 00402096 push offset string "virtual ~CSoft()\n" (00426118) 0040209B call printf (00402ad0) 004020A0 add esp,4 13: } 004020A3 pop edi 004020A4 pop esi 004020A5 pop ebx 004020A6 add esp,44h 004020A9 cmp ebp,esp 004020AB call __chkesp (004029a0) 004020B0 mov esp,ebp 004020B2 pop ebp 004020B3 ret 14: virtual int GetColor() 15: { 004020D0 push ebp 004020D1 mov ebp,esp 004020D3 sub esp,44h 004020D6 push ebx 004020D7 push esi 004020D8 push edi 004020D9 push ecx 004020DA lea edi,[ebp-44h] 004020DD mov ecx,11h 004020E2 mov eax,0CCCCCCCCh 004020E7 rep stos dword ptr [edi] 004020E9 pop ecx 004020EA mov dword ptr [ebp-4],ecx 16: return m_nColor; 004020ED mov eax,dword ptr [ebp-4] 004020F0 mov eax,dword ptr [eax+4] 17: } 004020F3 pop edi 004020F4 pop esi 004020F5 pop ebx 004020F6 mov esp,ebp 004020F8 pop ebp 004020F9 ret 18: virtual int SitDown() 19: { 00402110 push ebp 00402111 mov ebp,esp 00402113 sub esp,44h 00402116 push ebx 00402117 push esi 00402118 push edi 00402119 push ecx 0040211A lea edi,[ebp-44h] 0040211D mov ecx,11h 00402122 mov eax,0CCCCCCCCh 00402127 rep stos dword ptr [edi] 00402129 pop ecx 0040212A mov dword ptr [ebp-4],ecx 20: return printf("Sit down and rest your legs!\n"); 0040212D push offset string "Sit down and rest your legs!\n" (0042612c) 00402132 call printf (00402ad0) 00402137 add esp,4 21: } 0040213A pop edi 0040213B pop esi 0040213C pop ebx 0040213D add esp,44h 00402140 cmp ebp,esp 00402142 call __chkesp (004029a0) 00402147 mov esp,ebp 00402149 pop ebp 0040214A ret 22: protected: 23: int m_nColor; 24: }; 25: class CBed 26: { 27: public: 28: CBed() 004021D0 push ebp 004021D1 mov ebp,esp 004021D3 sub esp,44h 004021D6 push ebx 004021D7 push esi 004021D8 push edi 004021D9 push ecx 004021DA lea edi,[ebp-44h] 004021DD mov ecx,11h 004021E2 mov eax,0CCCCCCCCh 004021E7 rep stos dword ptr [edi] 004021E9 pop ecx 004021EA mov dword ptr [ebp-4],ecx 004021ED mov eax,dword ptr [ebp-4] 004021F0 mov dword ptr [eax],offset CBed::`vftable' (00426150) 29: { 30: m_nLength = 4; 004021F6 mov ecx,dword ptr [ebp-4] 004021F9 mov dword ptr [ecx+4],4 31: m_nWidth = 5; 00402200 mov edx,dword ptr [ebp-4] 00402203 mov dword ptr [edx+8],5 32: } 0040220A mov eax,dword ptr [ebp-4] 0040220D pop edi 0040220E pop esi 0040220F pop ebx 00402210 mov esp,ebp 00402212 pop ebp 00402213 ret 33: virtual ~CBed() 34: { 00402330 push ebp 00402331 mov ebp,esp 00402333 sub esp,44h 00402336 push ebx 00402337 push esi 00402338 push edi 00402339 push ecx 0040233A lea edi,[ebp-44h] 0040233D mov ecx,11h 00402342 mov eax,0CCCCCCCCh 00402347 rep stos dword ptr [edi] 00402349 pop ecx 0040234A mov dword ptr [ebp-4],ecx 0040234D mov eax,dword ptr [ebp-4] 00402350 mov dword ptr [eax],offset CBed::`vftable' (00426150) 35: printf("virtual ~CBed()\n"); 00402356 push offset string "virtual ~CBed()\n" (00426180) 0040235B call printf (00402ad0) 00402360 add esp,4 36: } 00402363 pop edi 00402364 pop esi 00402365 pop ebx 00402366 add esp,44h 00402369 cmp ebp,esp 0040236B call __chkesp (004029a0) 00402370 mov esp,ebp 00402372 pop ebp 00402373 ret 37: virtual int GetArea() 38: { 00402230 push ebp 00402231 mov ebp,esp 00402233 sub esp,44h 00402236 push ebx 00402237 push esi 00402238 push edi 00402239 push ecx 0040223A lea edi,[ebp-44h] 0040223D mov ecx,11h 00402242 mov eax,0CCCCCCCCh 00402247 rep stos dword ptr [edi] 00402249 pop ecx 0040224A mov dword ptr [ebp-4],ecx 39: return m_nLength * m_nWidth; 0040224D mov eax,dword ptr [ebp-4] 00402250 mov ecx,dword ptr [ebp-4] 00402253 mov eax,dword ptr [eax+4] 00402256 imul eax,dword ptr [ecx+8] 40: } 0040225A pop edi 0040225B pop esi 0040225C pop ebx 0040225D mov esp,ebp 0040225F pop ebp 00402260 ret 45: protected: 46: int m_nLength; 47: int m_nWidth; 48: }; 49: class CSoftBed : public CSoft , public CBed 50: { 51: public: 52: CSoftBed() 00401F60 push ebp 00401F61 mov ebp,esp 00401F63 push 0FFh 00401F65 push offset __ehhandler$??0CSoftBed@@QAE@XZ (00414839) 00401F6A mov eax,fs:[00000000] 00401F70 push eax 00401F71 mov dword ptr fs:[0],esp 00401F78 sub esp,44h 00401F7B push ebx 00401F7C push esi 00401F7D push edi 00401F7E push ecx 00401F7F lea edi,[ebp-50h] 00401F82 mov ecx,11h 00401F87 mov eax,0CCCCCCCCh 00401F8C rep stos dword ptr [edi] 00401F8E pop ecx 00401F8F mov dword ptr [ebp-10h],ecx 00401F92 mov ecx,dword ptr [ebp-10h] 00401F95 call @ILT+70(CSoft::CSoft) (0040104b) 00401F9A mov dword ptr [ebp-4],0 00401FA1 mov ecx,dword ptr [ebp-10h] 00401FA4 add ecx,8 00401FA7 call @ILT+235(CBed::CBed) (004010f0) 00401FAC mov eax,dword ptr [ebp-10h] 00401FAF mov dword ptr [eax],offset CSoftBed::`vftable' (004260f4) 00401FB5 mov ecx,dword ptr [ebp-10h] 00401FB8 mov dword ptr [ecx+8],offset CSoftBed::`vftable' (004260e4) 53: { 54: m_nHeight = 6; 00401FBF mov edx,dword ptr [ebp-10h] 00401FC2 mov dword ptr [edx+14h],6 55: } 00401FC9 mov dword ptr [ebp-4],0FFFFFFFFh 00401FD0 mov eax,dword ptr [ebp-10h] 00401FD3 mov ecx,dword ptr [ebp-0Ch] 00401FD6 mov dword ptr fs:[0],ecx 00401FDD pop edi 00401FDE pop esi 00401FDF pop ebx 00401FE0 add esp,50h 00401FE3 cmp ebp,esp 00401FE5 call __chkesp (004029a0) 00401FEA mov esp,ebp 00401FEC pop ebp 00401FED ret 56: virtual ~CSoftBed() 57: { 00402390 push ebp 00402391 mov ebp,esp 00402393 push 0FFh 00402395 push offset __ehhandler$??1CSoftBed@@UAE@XZ (00414859) 0040239A mov eax,fs:[00000000] 004023A0 push eax 004023A1 mov dword ptr fs:[0],esp 004023A8 sub esp,48h 004023AB push ebx 004023AC push esi 004023AD push edi 004023AE push ecx 004023AF lea edi,[ebp-54h] 004023B2 mov ecx,12h 004023B7 mov eax,0CCCCCCCCh 004023BC rep stos dword ptr [edi] 004023BE pop ecx 004023BF mov dword ptr [ebp-10h],ecx 004023C2 mov eax,dword ptr [ebp-10h] 004023C5 mov dword ptr [eax],offset CSoftBed::`vftable' (004260f4) 004023CB mov ecx,dword ptr [ebp-10h] 004023CE mov dword ptr [ecx+8],offset CSoftBed::`vftable' (004260e4) 004023D5 mov dword ptr [ebp-4],0 58: printf("virtual ~CSoftBed()\n"); 004023DC push offset string "virtual ~CSoftBed()\n" (004261a0) 004023E1 call printf (00402ad0) 004023E6 add esp,4 59: } 004023E9 cmp dword ptr [ebp-10h],0 004023ED je CSoftBed::~CSoftBed+6Ah (004023fa) 004023EF mov edx,dword ptr [ebp-10h] 004023F2 add edx,8 004023F5 mov dword ptr [ebp-14h],edx 004023F8 jmp CSoftBed::~CSoftBed+71h (00402401) 004023FA mov dword ptr [ebp-14h],0 00402401 mov ecx,dword ptr [ebp-14h] 00402404 call @ILT+195(CBed::~CBed) (004010c8) 00402409 mov dword ptr [ebp-4],0FFFFFFFFh 00402410 mov ecx,dword ptr [ebp-10h] 00402413 call @ILT+115(CSoft::~CSoft) (00401078) 00402418 mov ecx,dword ptr [ebp-0Ch] 0040241B mov dword ptr fs:[0],ecx 00402422 pop edi 00402423 pop esi 00402424 pop ebx 00402425 add esp,54h 00402428 cmp ebp,esp 0040242A call __chkesp (004029a0) 0040242F mov esp,ebp 00402431 pop ebp 00402432 ret 60: virtual SitDown() 61: { 00402460 push ebp 00402461 mov ebp,esp 00402463 sub esp,44h 00402466 push ebx 00402467 push esi 00402468 push edi 00402469 push ecx 0040246A lea edi,[ebp-44h] 0040246D mov ecx,11h 00402472 mov eax,0CCCCCCCCh 00402477 rep stos dword ptr [edi] 00402479 pop ecx 0040247A mov dword ptr [ebp-4],ecx 62: return printf("sit down on the soft bed\n"); 0040247D push offset string "sit down on the soft bed\n" (004271d0) 00402482 call printf (00402ad0) 00402487 add esp,4 63: } 0040248A pop edi 0040248B pop esi 0040248C pop ebx 0040248D add esp,44h 00402490 cmp ebp,esp 00402492 call __chkesp (004029a0) 00402497 mov esp,ebp 00402499 pop ebp 0040249A ret 64: virtual int Sleep() 65: { 004024B0 push ebp 004024B1 mov ebp,esp 004024B3 sub esp,44h 004024B6 push ebx 004024B7 push esi 004024B8 push edi 004024B9 push ecx 004024BA lea edi,[ebp-44h] 004024BD mov ecx,11h 004024C2 mov eax,0CCCCCCCCh 004024C7 rep stos dword ptr [edi] 004024C9 pop ecx 004024CA mov dword ptr [ebp-4],ecx 66: return printf("go to sleep on the sofa bed\n"); 004024CD push offset string "go to sleep on the sofa bed\n" (004271ec) 004024D2 call printf (00402ad0) 004024D7 add esp,4 67: } 004024DA pop edi 004024DB pop esi 004024DC pop ebx 004024DD add esp,44h 004024E0 cmp ebp,esp 004024E2 call __chkesp (004029a0) 004024E7 mov esp,ebp 004024E9 pop ebp 004024EA ret 68: virtual int GetHeight() 69: { 00402500 push ebp 00402501 mov ebp,esp 00402503 sub esp,44h 00402506 push ebx 00402507 push esi 00402508 push edi 00402509 push ecx 0040250A lea edi,[ebp-44h] 0040250D mov ecx,11h 00402512 mov eax,0CCCCCCCCh 00402517 rep stos dword ptr [edi] 00402519 pop ecx 0040251A mov dword ptr [ebp-4],ecx 70: return m_nHeight; 0040251D mov eax,dword ptr [ebp-4] 00402520 mov eax,dword ptr [eax+14h] 71: } 00402523 pop edi 00402524 pop esi 00402525 pop ebx 00402526 mov esp,ebp 00402528 pop ebp 00402529 ret 72: protected: 73: int m_nHeight; 74: }; 75: int main() 76: { 00410090 push ebp 00410091 mov ebp,esp 00410093 push 0FFh 00410095 push offset __ehhandler$_main (00414819) 0041009A mov eax,fs:[00000000] 004100A0 push eax 004100A1 mov dword ptr fs:[0],esp 004100A8 sub esp,68h 004100AB push ebx 004100AC push esi 004100AD push edi 004100AE lea edi,[ebp-74h] 004100B1 mov ecx,1Ah 004100B6 mov eax,0CCCCCCCCh 004100BB rep stos dword ptr [edi] 77: CSoftBed softBed; 004100BD lea ecx,[ebp-24h] 004100C0 call @ILT+100(CSoftBed::CSoftBed) (00401069) 004100C5 mov dword ptr [ebp-4],0 78: CSoft *pSoft = &softBed; 004100CC lea eax,[ebp-24h] EAX = 0018FF24 004100CF mov dword ptr [ebp-28h],eax 79: CBed *pBed = &softBed; 004100D2 lea ecx,[ebp-24h] 004100D5 test ecx,ecx 004100D7 je main+51h (004100e1) 004100D9 lea edx,[ebp-1Ch] EDX = 0018FF2C继承的CBed对象部分 004100DC mov dword ptr [ebp-34h],edx 004100DF jmp main+58h (004100e8) 004100E1 mov dword ptr [ebp-34h],0 004100E8 mov eax,dword ptr [ebp-34h] 004100EB mov dword ptr [ebp-2Ch],eax 80: pSoft->SitDown(); 004100EE mov ecx,dword ptr [ebp-28h] 004100F1 mov edx,dword ptr [ecx] 004100F3 mov esi,esp 004100F5 mov ecx,dword ptr [ebp-28h] 004100F8 call dword ptr [edx+8] 004100FB cmp esi,esp 004100FD call __chkesp (004029a0) 81: pBed->Sleep(); 00410102 mov eax,dword ptr [ebp-2Ch] 00410105 mov edx,dword ptr [eax] EDX = 004260E4 00410107 mov esi,esp 00410109 mov ecx,dword ptr [ebp-2Ch] 0041010C call dword ptr [edx+8] 0041010F cmp esi,esp 00410111 call __chkesp (004029a0) 82: printf("Color = %d\n" , pSoft->GetColor()); 00410116 mov eax,dword ptr [ebp-28h] EAX = 0018FF24 00410119 mov edx,dword ptr [eax] EDX = 004260F4 0041011B mov esi,esp 0041011D mov ecx,dword ptr [ebp-28h] CSoft部分首地址 ECX = 0018FF24 00410120 call dword ptr [edx+4] edx虚函数表首地址 00410123 cmp esi,esp 00410125 call __chkesp (004029a0) 0041012A push eax 0041012B push offset string "Color = %d\n" (004260d0) 00410130 call printf (00402ad0) 00410135 add esp,8 83: printf("area = %d\n" , pBed->GetArea()); 00410138 mov eax,dword ptr [ebp-2Ch] 0041013B mov edx,dword ptr [eax] 0041013D mov esi,esp 0041013F mov ecx,dword ptr [ebp-2Ch] 00410142 call dword ptr [edx+4] 00410145 cmp esi,esp 00410147 call __chkesp (004029a0) 0041014C push eax 0041014D push offset string "area = %d\n" (004260c0) 00410152 call printf (00402ad0) 00410157 add esp,8 84: return 0; 0041015A mov dword ptr [ebp-30h],0 00410161 mov dword ptr [ebp-4],0FFFFFFFFh 00410168 lea ecx,[ebp-24h] 0041016B call @ILT+60(CSoftBed::~CSoftBed) (00401041) 00410170 mov eax,dword ptr [ebp-30h] 85: } 00410173 mov ecx,dword ptr [ebp-0Ch] 00410176 mov dword ptr fs:[0],ecx 0041017D pop edi 0041017E pop esi 0041017F pop ebx 00410180 add esp,74h 00410183 cmp ebp,esp 00410185 call __chkesp (004029a0) 0041018A mov esp,ebp 0041018C pop ebp 0041018D ret 0018FF0E CC CC CC CC CC CC 2C FF 18 00 CC 烫烫烫,.... 0018FF19 CC CC CC 2C FF 18 00 24 FF 18 00 烫.,...$... 0018FF24 F4 60 42 00 02 00 00 00 E4 60 42 鬬B.....鋊B 0018FF2F 00 04 00 00 00 05 00 00 00 06 00 ........... 0018FF3A 00 00 78 FF 18 00 19 48 41 00 00 ..x....HA.. 0018FF45 00 00 00 88 FF 18 00 C9 2C 40 00 ........,@. 0018FF50 01 00 00 00 B8 19 3E 00 30 1A 3E ......>.0.> @ILT+100(??0CSoftBed@@QAE@XZ): 00401069 jmp CSoftBed::CSoftBed (00401f60) @ILT+105(?main4@@YAHXZ): 0040106E jmp main4 (00401630) @ILT+110(??1CGerman@@UAE@XZ): 00401073 jmp CGerman::~CGerman (00401d40) @ILT+115(??1CSoft@@UAE@XZ): 00401078 jmp CSoft::~CSoft (00402070) @ILT+120(??_ECGerman@@UAEPAXI@Z): 0040107D jmp CGerman::`scalar deleting destructor' (00401e20) @ILT+125(??1CDerive@@QAE@XZ): 00401082 jmp CDerive::~CDerive (00401480) @ILT+130(??_ECSoftBed@@UAEPAXI@Z): 00401087 jmp CSoftBed::`scalar deleting destructor' (00402540) @ILT+135(??0CPerson@@QAE@XZ): 0040108C jmp CPerson::CPerson (00401790) @ILT+140(??_ECChinese@@UAEPAXI@Z): 00401091 jmp CChinese::`scalar deleting destructor' (00401a40) @ILT+145(?SitDown@CSoft@@UAEHXZ): 00401096 jmp CSoft::SitDown (00402110) @ILT+150(??1CAmerican@@UAE@XZ): 0040109B jmp CAmerican::~CAmerican (00401b50) @ILT+155(?main2@@YAHXZ): 004010A0 jmp main2 (004015a0) @ILT+160(?GetClassName@CPerson@@UAEPADXZ): 004010A5 jmp CPerson::GetClassName (004018b0) @ILT+165(??1CChinese@@UAE@XZ): 004010AA jmp CChinese::~CChinese (00401960) @ILT+170(?Sleep@CSoftBed@@UAEHXZ): 004010AF jmp CSoftBed::Sleep (004024b0) @ILT+175(??_ECSoftBed@@UAEPAXI@Z): 004010B4 jmp CSoftBed::`scalar deleting destructor' (00402540) ??_7CSoftBed@@6BCSoft@@@: 004260F4 xchg edx,dword ptr [eax] 004260F6 inc eax 004260F7 add byte ptr [ecx+edx],al 004260FA inc eax 004260FB add ah,bl 004260FD adc byte ptr [eax],al 00426100 or dword ptr [ecx],edx 00426102 inc eax 00426103 add byte ptr [eax],al 00426105 add byte ptr [eax],al 00426107 add byte ptr [eax],al 00426109 add byte ptr [eax],al 0042610B add byte ptr ds:[4004010h],ch 00426111 adc dword ptr [eax],eax 00426114 xchg eax,esi 00426115 adc byte ptr [eax],al
原文:http://blog.csdn.net/u011185633/article/details/44828413