废话不多说。。
#include<stdio.h> class CNumber { public: CNumber() { m_nOne = 1; m_nTwo = 2; } int __stdcall GetNumberOne() { return m_nOne; } int GetNumberTwo() { return m_nTwo; }<pre name="code" class="plain">1: #include<stdio.h> 2: 3: class CNumber 4: { 5: public: 6: CNumber() 00401060 push ebp 00401061 mov ebp,esp 00401063 sub esp,44h 00401066 push ebx 00401067 push esi 00401068 push edi 00401069 push ecx 0040106A lea edi,[ebp-44h] 0040106D mov ecx,11h 00401072 mov eax,0CCCCCCCCh 00401077 rep stos dword ptr [edi] 00401079 pop ecx 0040107A mov dword ptr [ebp-4],ecx 7: { 8: m_nOne = 1; 0040107D mov eax,dword ptr [ebp-4] 00401080 mov dword ptr [eax],1 9: m_nTwo = 2; 00401086 mov ecx,dword ptr [ebp-4] 00401089 mov dword ptr [ecx+4],2 10: } 00401090 mov eax,dword ptr [ebp-4] 00401093 pop edi 00401094 pop esi 00401095 pop ebx 00401096 mov esp,ebp 00401098 pop ebp 00401099 ret 11: int GetNumberOne() 12: { 13: return m_nOne; 14: } 15: int GetNumberTwo() 16: { 17: return m_nTwo; 18: } 19: private: 20: int m_nOne; 21: int m_nTwo; 22: }; 23: int main() 24: { 00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,48h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 lea edi,[ebp-48h] 0040102C mov ecx,12h 00401031 mov eax,0CCCCCCCCh 00401036 rep stos dword ptr [edi] 25: CNumber number; 00401038 lea ecx,[ebp-8] 0040103B call @ILT+0(CNumber::CNumber) (00401005) 26: return 0; 00401040 xor eax,eax 27: } 00401042 pop edi 00401043 pop esi 00401044 pop ebx 00401045 add esp,48h 00401048 cmp ebp,esp 0040104A call __chkesp (004010b0) 0040104F mov esp,ebp 00401051 pop ebp 00401052 ret 1: #include<stdio.h> 2: 3: struct A 4: { 5: int m_nInt; 6: float m_fFloat; 7: }; 8: 9: int main() 10: { 004011A0 push ebp 004011A1 mov ebp,esp 004011A3 sub esp,4Ch 004011A6 push ebx 004011A7 push esi 004011A8 push edi 004011A9 lea edi,[ebp-4Ch] 004011AC mov ecx,13h 004011B1 mov eax,0CCCCCCCCh 004011B6 rep stos dword ptr [edi] 11: A a; 12: A *pA = &a; 004011B8 lea eax,[ebp-8] 004011BB mov dword ptr [ebp-0Ch],eax 13: printf("%p\n" , pA); 004011BE mov ecx,dword ptr [ebp-0Ch] 004011C1 push ecx 004011C2 push offset string "%p\n" (0042601c) 004011C7 call printf (00401210) 004011CC add esp,8 14: printf("%p\n" , &pA->m_fFloat); 004011CF mov edx,dword ptr [ebp-0Ch] 004011D2 add edx,4 偏移地址 004011D5 push edx 004011D6 push offset string "%p\n" (0042601c) 004011DB call printf (00401210) 004011E0 add esp,8 15: return 0; 004011E3 xor eax,eax 16: } 004011E5 pop edi 004011E6 pop esi 004011E7 pop ebx 004011E8 add esp,4Ch 004011EB cmp ebp,esp 004011ED call __chkesp (00401340) 004011F2 mov esp,ebp 004011F4 pop ebp 004011F5 ret __stdcall不用ecx传递this指针,而是使用栈传递。 11: int __stdcall GetNumberOne() 12: { 00401160 push ebp 00401161 mov ebp,esp 00401163 sub esp,40h 00401166 push ebx 00401167 push esi 00401168 push edi 00401169 lea edi,[ebp-40h] 0040116C mov ecx,10h 00401171 mov eax,0CCCCCCCCh 00401176 rep stos dword ptr [edi] 13: return m_nOne; 00401178 mov eax,dword ptr [ebp+8] this 0040117B mov eax,dword ptr [eax] 14: } 0040117D pop edi 0040117E pop esi 0040117F pop ebx 00401180 mov esp,ebp 00401182 pop ebp 00401183 ret 4 15: int GetNumberTwo() 16: { 00410AE0 push ebp 00410AE1 mov ebp,esp 00410AE3 sub esp,44h 00410AE6 push ebx 00410AE7 push esi 00410AE8 push edi 00410AE9 push ecx 00410AEA lea edi,[ebp-44h] 00410AED mov ecx,11h 00410AF2 mov eax,0CCCCCCCCh 00410AF7 rep stos dword ptr [edi] 00410AF9 pop ecx this 00410AFA mov dword ptr [ebp-4],ecx 17: return m_nTwo; 00410AFD mov eax,dword ptr [ebp-4] 00410B00 mov eax,dword ptr [eax+4] 18: } 00410B03 pop edi 00410B04 pop esi 00410B05 pop ebx 00410B06 mov esp,ebp 00410B08 pop ebp 00410B09 ret 反汇编分析 1: #include<stdio.h> 2: 3: class CStatic 4: { 5: public: 6: void ShowNumber(); 7: int m_nInt; 8: static int m_snInt; 9: }; 10: void CStatic :: ShowNumber() 11: { 00401290 push ebp 00401291 mov ebp,esp 00401293 sub esp,44h 00401296 push ebx 00401297 push esi 00401298 push edi 00401299 push ecx 0040129A lea edi,[ebp-44h] 0040129D mov ecx,11h 004012A2 mov eax,0CCCCCCCCh 004012A7 rep stos dword ptr [edi] 004012A9 pop ecx 004012AA mov dword ptr [ebp-4],ecx 12: printf("m_nInt = %d , m_snInt = %d\n" , m_nInt , m_snInt); 004012AD mov eax,[CStatic::m_snInt (00428a30)] 004012B2 push eax 004012B3 mov ecx,dword ptr [ebp-4] 004012B6 mov edx,dword ptr [ecx] 004012B8 push edx 004012B9 push offset string "m_nInt = %d , m_snInt = %d\n" (00426024) 004012BE call printf (00401340) 004012C3 add esp,0Ch 13: } 004012C6 pop edi 004012C7 pop esi 004012C8 pop ebx 004012C9 add esp,44h 004012CC cmp ebp,esp 004012CE call __chkesp (00401470) 004012D3 mov esp,ebp 004012D5 pop ebp 004012D6 ret 14: int CStatic::m_snInt = 9; 15: int main() 16: { 004012F0 push ebp 004012F1 mov ebp,esp 004012F3 sub esp,44h 004012F6 push ebx 004012F7 push esi 004012F8 push edi 004012F9 lea edi,[ebp-44h] 004012FC mov ecx,11h 00401301 mov eax,0CCCCCCCCh 00401306 rep stos dword ptr [edi] 17: CStatic sta; 18: sta.m_nInt = 2; 00401308 mov dword ptr [ebp-4],2 19: sta.ShowNumber(); 0040130F lea ecx,[ebp-4] 00401312 call @ILT+5(CStatic::ShowNumber) (0040100a) 20: return 0; 00401317 xor eax,eax 21: } 00401319 pop edi 0040131A pop esi 0040131B pop ebx 0040131C add esp,44h 0040131F cmp ebp,esp 00401321 call __chkesp (00401470) 00401326 mov esp,ebp 00401328 pop ebp 00401329 ret 1: #include<stdio.h> 2: 3: class CFunTest 4: { 5: public: 6: int m_nOne; 7: int m_nTwo; 8: }; 9: void ShowFuncTest(CFunTest fun) 10: { 00401350 push ebp 00401351 mov ebp,esp 00401353 sub esp,40h 00401356 push ebx 00401357 push esi 00401358 push edi 00401359 lea edi,[ebp-40h] 0040135C mov ecx,10h 00401361 mov eax,0CCCCCCCCh 00401366 rep stos dword ptr [edi] 11: printf("m_nOne = %d , m_nTwo = %d\n" , fun.m_nOne , fun.m_nTwo); 00401368 mov eax,dword ptr [ebp+0Ch] 0040136B push eax 0040136C mov ecx,dword ptr [ebp+8] 0040136F push ecx 00401370 push offset string "m_nOne = %d , m_nTwo = %d\n" (00426048) 00401375 call printf (00401400) 0040137A add esp,0Ch 12: } 0040137D pop edi 0040137E pop esi 0040137F pop ebx 00401380 add esp,40h 00401383 cmp ebp,esp 00401385 call __chkesp (00401530) 0040138A mov esp,ebp 0040138C pop ebp 0040138D ret 13: void main() 14: { 004013A0 push ebp 004013A1 mov ebp,esp 004013A3 sub esp,48h 004013A6 push ebx 004013A7 push esi 004013A8 push edi 004013A9 lea edi,[ebp-48h] 004013AC mov ecx,12h 004013B1 mov eax,0CCCCCCCCh 004013B6 rep stos dword ptr [edi] 15: CFunTest fun; 16: fun.m_nOne = 9; 004013B8 mov dword ptr [ebp-8],9 17: fun.m_nTwo = 99; 004013BF mov dword ptr [ebp-4],63h 18: ShowFuncTest(fun); 004013C6 mov eax,dword ptr [ebp-4] 004013C9 push eax 004013CA mov ecx,dword ptr [ebp-8] 004013CD push ecx 004013CE call @ILT+0(ShowFuncTest) (00401005) 004013D3 add esp,8 19: } 004013D6 pop edi 004013D7 pop esi 004013D8 pop ebx 004013D9 add esp,48h 004013DC cmp ebp,esp 004013DE call __chkesp (00401530) 004013E3 mov esp,ebp 004013E5 pop ebp 004013E6 ret 1: #include<stdio.h> 2: #include<string.h> 3: class CFunTest 4: { 5: public: 6: int m_nOne; 7: int m_nTwo; 8: char m_szName[32]; 9: }; 10: void ShowFuncTest(CFunTest fun) 11: { 00401350 push ebp 00401351 mov ebp,esp 00401353 sub esp,40h 00401356 push ebx 00401357 push esi 00401358 push edi 00401359 lea edi,[ebp-40h] 0040135C mov ecx,10h 00401361 mov eax,0CCCCCCCCh 00401366 rep stos dword ptr [edi] 12: printf("m_nOne = %d , m_nTwo = %d , m_szName = %s\n" , fun.m_nOne , fun.m_nTwo , fun.m_szName); 00401368 lea eax,[ebp+10h] //m_szName 0040136B push eax 0040136C mov ecx,dword ptr [ebp+0Ch] //m_nTwo 0040136F push ecx 00401370 mov edx,dword ptr [ebp+8] //m_nOne 00401373 push edx 00401374 push offset string "m_nOne = %d , m_nTwo = %d , m_sz"... (00427050) 00401379 call printf (00401400) 0040137E add esp,10h 13: } 00401381 pop edi 00401382 pop esi 00401383 pop ebx 00401384 add esp,40h 00401387 cmp ebp,esp 00401389 call __chkesp (00401530) 0040138E mov esp,ebp 00401390 pop ebp 00401391 ret 14: void main() 15: { 004013A0 push ebp 004013A1 mov ebp,esp 004013A3 sub esp,68h 004013A6 push ebx 004013A7 push esi 004013A8 push edi 004013A9 lea edi,[ebp-68h] 004013AC mov ecx,1Ah 004013B1 mov eax,0CCCCCCCCh 004013B6 rep stos dword ptr [edi] 16: CFunTest fun; 17: fun.m_nOne = 9; 004013B8 mov dword ptr [ebp-28h],9 18: fun.m_nTwo = 99; 004013BF mov dword ptr [ebp-24h],63h 19: strcpy(fun.m_szName , "NAME"); 004013C6 push offset string "NAME" (00426040) 004013CB lea eax,[ebp-20h] ebp-32 m_szName 004013CE push eax 004013CF call strcpy (00407c80) 20: ShowFuncTest(fun); 004013D4 add esp,0E0h //sub esp , 68h add esp , 0e0h 004013D7 mov ecx,0Ah 004013DC lea esi,[ebp-28h] 004013DF mov edi,esp 004013E1 rep movs dword ptr [edi],dword ptr [esi] 40BYTE 004013E3 call @ILT+0(ShowFuncTest) (00401005) 004013E8 add esp,28h 40BYTE 21: } 004013EB pop edi 004013EC pop esi 004013ED pop ebx 004013EE add esp,68h 004013F1 cmp ebp,esp 004013F3 call __chkesp (00401530) 004013F8 mov esp,ebp 004013FA pop ebp 004013FB ret 004013D4 add esp,0E0h 004013D7 mov ecx,0Ah 004013DC lea esi,[ebp-28h] 004013DF mov edi,esp edi即是esp栈顶 此处进行值传递 004013E1 rep movs dword ptr [edi],dword ptr [esi] 004013E3 call @ILT+0(ShowFuncTest) (00401005) 004013E8 add esp,28h EAX = 0018FF28 EBX = 7EFDE000 ECX = 00000000 EDX = 00000000 ESI = 0018FF48 EDI = 0018FED4 EIP = 004013E3 ESP = 0018FEAC EBP = 0018FF48 EFL = 00000207 0018FEAC 09 00 00 00 63 00 00 00 4E 41 4D ...c...NAM 0018FEB7 45 00 CC CC CC CC CC CC CC CC CC E.烫烫烫烫. 0018FEC2 CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫. 0018FECD CC CC CC CC CC CC CC 00 00 00 00 烫烫烫..... 0018FED8 00 00 00 00 00 E0 FD 7E CC CC CC .....帻~烫. 0018FEE3 CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫.
另一个例子
#include<stdio.h> class CReturn { public: int m_nNumber; int m_nArray[10]; }; CReturn GetReturn() { CReturn ret; ret.m_nNumber = 0; for(int i = 0; i < 10; ++i) { ret.m_nArray[i] = i + 1; } return ret; } void main() { CReturn objA; objA = GetReturn(); printf("%d %d %d\n" , objA.m_nNumber , objA.m_nArray[0] , objA.m_nArray[9]); }
1: #include<stdio.h> 2: 3: class CReturn 4: { 5: public: 6: int m_nNumber; 7: int m_nArray[10]; 8: }; 9: CReturn GetReturn() 10: { 004016F0 push ebp ebp=ebp0-2ch-8h 004016F1 mov ebp,esp 004016F3 sub esp,70h 004016F6 push ebx 004016F7 push esi 004016F8 push edi 004016F9 lea edi,[ebp-70h] 004016FC mov ecx,1Ch 00401701 mov eax,0CCCCCCCCh 00401706 rep stos dword ptr [edi] 11: CReturn ret; 12: ret.m_nNumber = 0; 00401708 mov dword ptr [ebp-2Ch],0 13: for(int i = 0; i < 10; ++i) 0040170F mov dword ptr [ebp-30h],0 i 00401716 jmp GetReturn+31h (00401721) 00401718 mov eax,dword ptr [ebp-30h] 0040171B add eax,1 0040171E mov dword ptr [ebp-30h],eax 00401721 cmp dword ptr [ebp-30h],0Ah i < 10 00401725 jge GetReturn+46h (00401736) 14: { 15: ret.m_nArray[i] = i + 1; 00401727 mov ecx,dword ptr [ebp-30h] 0040172A add ecx,1 0040172D mov edx,dword ptr [ebp-30h] 00401730 mov dword ptr [ebp+edx*4-28h],ecx //m_nArray[i] = i + 1 16: } 00401734 jmp GetReturn+28h (00401718) 17: return ret; 00401736 mov ecx,0Bh //0B 11 44字节 0040173B lea esi,[ebp-2Ch] 0040173E mov edi,dword ptr [ebp+8] //传送数据 返回值 00401741 rep movs dword ptr [edi],dword ptr [esi] 00401743 mov eax,dword ptr [ebp+8] 18: } 00401746 pop edi 00401747 pop esi 00401748 pop ebx 00401749 mov esp,ebp 0040174B pop ebp 0040174C ret 19: void main() 20: { 00401770 push ebp 00401771 mov ebp,esp 00401773 sub esp,0C4h //预留栈空间 12*16+4 00401779 push ebx 0040177A push esi 0040177B push edi 0040177C lea edi,[ebp-0C4h] 00401782 mov ecx,31h 00401787 mov eax,0CCCCCCCCh 0040178C rep stos dword ptr [edi] 21: CReturn objA; //44 11*4 2ch ebp-2ch 22: objA = GetReturn(); 0040178E lea eax,[ebp-84h] //8*16+4 44+44 00401794 push eax //返回地址压栈 00401795 call @ILT+45(GetReturn) (00401032) 0040179A add esp,4 //eax栈平衡 0040179D mov esi,eax //返回值地址 0040179F mov ecx,0Bh 004017A4 lea edi,[ebp-58h] 004017A7 rep movs dword ptr [edi],dword ptr [esi] //传送至临时对象 临时对象释放时,可能存在多次释放资源现象。 004017A9 mov ecx,0Bh 004017AE lea esi,[ebp-58h] 004017B1 lea edi,[ebp-2Ch] 004017B4 rep movs dword ptr [edi],dword ptr [esi] 23: printf("%d %d %d\n" , objA.m_nNumber , objA.m_nArray[0] , objA.m_nArray[9]); 004017B6 mov ecx,dword ptr [ebp-4] 004017B9 push ecx 004017BA mov edx,dword ptr [ebp-28h] 004017BD push edx 004017BE mov eax,dword ptr [ebp-2Ch] 004017C1 push eax 004017C2 push offset string "%d %d %d\n" (00429090) 004017C7 call printf (00401800) 004017CC add esp,10h 24: 25: } 004017CF pop edi 004017D0 pop esi 004017D1 pop ebx 004017D2 add esp,0C4h 004017D8 cmp ebp,esp 004017DA call __chkesp (00401930) 004017DF mov esp,ebp 004017E1 pop ebp 004017E2 ret
#include<stdio.h> #include<string.h> class CMyString { public: CMyString() { m_pString = new char[10]; if(NULL == m_pString) { return ; } strcpy(m_pString , "Hello"); } ~CMyString() { if(m_pString != NULL) { delete [] m_pString; m_pString = NULL; } } char * GetString() { return m_pString; } private: char *m_pString; }; void ShowMyString(CMyString str) { printf("%s\n" , str.GetString()); } int main5() { CMyString str; ShowMyString(str); // return 0; }
1: #include<stdio.h> 2: #include<string.h> 3: 4: class CMyString 5: { 6: public: 7: CMyString() 00401660 push ebp 00401661 mov ebp,esp 00401663 sub esp,48h 00401666 push ebx 00401667 push esi 00401668 push edi 00401669 push ecx 0040166A lea edi,[ebp-48h] 0040166D mov ecx,12h 00401672 mov eax,0CCCCCCCCh 00401677 rep stos dword ptr [edi] 00401679 pop ecx 0040167A mov dword ptr [ebp-4],ecx 8: { 9: m_pString = new char[10]; 0040167D push 0Ah 0040167F call operator new (00401ea0) 00401684 add esp,4 00401687 mov dword ptr [ebp-8],eax 0040168A mov eax,dword ptr [ebp-4] 0040168D mov ecx,dword ptr [ebp-8] 00401690 mov dword ptr [eax],ecx 10: if(NULL == m_pString) 00401692 mov edx,dword ptr [ebp-4] 00401695 cmp dword ptr [edx],0 00401698 jne CMyString::CMyString+3Ch (0040169c) 11: { 12: return ; 0040169A jmp CMyString::CMyString+4Fh (004016af) 13: } 14: strcpy(m_pString , "Hello"); 0040169C push offset string "Hello" (00429088) 004016A1 mov eax,dword ptr [ebp-4] 004016A4 mov ecx,dword ptr [eax] 004016A6 push ecx 004016A7 call strcpy (00401850) 004016AC add esp,8 15: } 004016AF mov eax,dword ptr [ebp-4] 004016B2 pop edi 004016B3 pop esi 004016B4 pop ebx 004016B5 add esp,48h 004016B8 cmp ebp,esp 004016BA call __chkesp (00401810) 004016BF mov esp,ebp 004016C1 pop ebp 004016C2 ret 16: ~CMyString() 17: { 00401510 push ebp 00401511 mov ebp,esp 00401513 sub esp,48h 00401516 push ebx 00401517 push esi 00401518 push edi 00401519 push ecx 0040151A lea edi,[ebp-48h] 0040151D mov ecx,12h 00401522 mov eax,0CCCCCCCCh 00401527 rep stos dword ptr [edi] 00401529 pop ecx 0040152A mov dword ptr [ebp-4],ecx 18: if(m_pString != NULL) 0040152D mov eax,dword ptr [ebp-4] 00401530 cmp dword ptr [eax],0 00401533 je CMyString::~CMyString+42h (00401552) 19: { 20: delete [] m_pString; 00401535 mov ecx,dword ptr [ebp-4] 00401538 mov edx,dword ptr [ecx] 0040153A mov dword ptr [ebp-8],edx 0040153D mov eax,dword ptr [ebp-8] 00401540 push eax 00401541 call operator delete (00401e10) 00401546 add esp,4 21: m_pString = NULL; 00401549 mov ecx,dword ptr [ebp-4] 0040154C mov dword ptr [ecx],0 22: } 23: } 00401552 pop edi 00401553 pop esi 00401554 pop ebx 00401555 add esp,48h 00401558 cmp ebp,esp 0040155A call __chkesp (00401810) 0040155F mov esp,ebp 00401561 pop ebp 00401562 ret 24: char * GetString() 25: { 00401580 push ebp 00401581 mov ebp,esp 00401583 sub esp,44h 00401586 push ebx 00401587 push esi 00401588 push edi 00401589 push ecx 0040158A lea edi,[ebp-44h] 0040158D mov ecx,11h 00401592 mov eax,0CCCCCCCCh 00401597 rep stos dword ptr [edi] 00401599 pop ecx 0040159A mov dword ptr [ebp-4],ecx 26: return m_pString; 0040159D mov eax,dword ptr [ebp-4] eax相当于二维指针 004015A0 mov eax,dword ptr [eax] 27: } 004015A2 pop edi 004015A3 pop esi 004015A4 pop ebx 004015A5 mov esp,ebp 004015A7 pop ebp 004015A8 ret 28: private: 29: char *m_pString; 30: }; 31: 32: void ShowMyString(CMyString str) 33: { 00401470 push ebp 00401471 mov ebp,esp 00401473 push 0FFh 00401475 push offset __ehhandler$?ShowMyString@@YAXVCMyString@@@Z (00417769) 0040147A mov eax,fs:[00000000] 00401480 push eax 00401481 mov dword ptr fs:[0],esp 00401488 sub esp,40h 0040148B push ebx 0040148C push esi 0040148D push edi 0040148E lea edi,[ebp-4Ch] 00401491 mov ecx,10h 00401496 mov eax,0CCCCCCCCh 0040149B rep stos dword ptr [edi] 0040149D mov dword ptr [ebp-4],0 34: printf("%s\n" , str.GetString()); 004014A4 lea ecx,[ebp+8] 004014A7 call @ILT+0(CMyString::GetString) (00401005) ECX = 0018FEE4 004014AC push eax 004014AD push offset string "%s\n" (00429084) 004014B2 call printf (004016e0) 004014B7 add esp,8 35: } 004014BA mov dword ptr [ebp-4],0FFFFFFFFh 004014C1 lea ecx,[ebp+8] ECX = 0018FEE4 004014C4 call @ILT+60(CMyString::~CMyString) (00401041) //释放资源 004014C9 mov ecx,dword ptr [ebp-0Ch] 004014CC mov dword ptr fs:[0],ecx 004014D3 pop edi 004014D4 pop esi 004014D5 pop ebx 004014D6 add esp,4Ch 004014D9 cmp ebp,esp 004014DB call __chkesp (00401810) 004014E0 mov esp,ebp 004014E2 pop ebp 004014E3 ret 36: int main() 37: { 004015C0 push ebp 004015C1 mov ebp,esp 004015C3 push 0FFh 004015C5 push offset __ehhandler$_main (00417789) 004015CA mov eax,fs:[00000000] 004015D0 push eax 004015D1 mov dword ptr fs:[0],esp 004015D8 sub esp,48h 004015DB push ebx 004015DC push esi 004015DD push edi 004015DE lea edi,[ebp-54h] 004015E1 mov ecx,12h 004015E6 mov eax,0CCCCCCCCh 004015EB rep stos dword ptr [edi] 38: CMyString str; 004015ED lea ecx,[ebp-10h] 004015F0 call @ILT+30(CMyString::CMyString) (00401023) 004015F5 mov dword ptr [ebp-4],0 39: ShowMyString(str); // 004015FC mov eax,dword ptr [ebp-10h] 004015FF push eax 00401600 call @ILT+55(ShowMyString) (0040103c) 00401605 add esp,4 40: return 0; 00401608 mov dword ptr [ebp-14h],0 0040160F mov dword ptr [ebp-4],0FFFFFFFFh 00401616 lea ecx,[ebp-10h] 00401619 call @ILT+60(CMyString::~CMyString) (00401041) ECX = 0018FF38 0040161E mov eax,dword ptr [ebp-14h] 41: } 00401621 mov ecx,dword ptr [ebp-0Ch] 00401624 mov dword ptr fs:[0],ecx 0040162B pop edi 0040162C pop esi 0040162D pop ebx 0040162E add esp,54h 00401631 cmp ebp,esp 00401633 call __chkesp (00401810) 00401638 mov esp,ebp 0040163A pop ebp 0040163B ret ShowMyString EAX = 00713A48 == [ebp - 10h] 00713A48 48 65 6C 6C 6F 00 CD CD CD CD FD Hello.屯屯. 00713A53 FD FD FD AD BA AB AB AB AB AB AB 韩. 00713A5E AB AB 00 00 00 00 00 00 00 00 D8 ......... 00713A69 47 B3 B5 B1 93 00 00 08 0F 71 00 G车睋....q. 00713A74 C4 00 71 00 EE FE EE FE EE FE EE ..q.铪铪铪. 00713A7F FE EE FE EE FE EE FE EE FE EE FE . lea ecx,[ebp+8] ECX = 0018FEE4 0040159A mov dword ptr [ebp-4],ecx ECX = 0018FEE4 EBP = 0018FEDC 0018FED1 FF 18 00 69 77 41 00 00 00 00 00 ...iwA..... 0018FEDC 48 FF 18 00 05 16 40 00 48 3A 71 H.....@.H:q 0018FEE7 00 00 00 00 00 00 00 00 00 00 E0 ........... 0040152A mov dword ptr [ebp-4],ecx ECX = 0018FEE4 EAX = 0018FEE4 EBX = 7EFDE000 ECX = 0018FEE4 EDX = 0042BCA0 ESI = 00000000 EDI = 0018FE7C EIP = 00401538 ESP = 0018FE28 EBP = 0018FE7C EFL = 00000206 00401535 mov ecx,dword ptr [ebp-4] 00401538 mov edx,dword ptr [ecx] 0040153A mov dword ptr [ebp-8],edx 0040153D mov eax,dword ptr [ebp-8] 00401540 push eax 00401541 call operator delete (00401e10) 00401546 add esp,4 0018FE63 CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫. 0018FE6E CC CC CC CC CC CC CC CC CC CC E4 烫烫烫烫烫. 0018FE79 FE 18 00 DC FE 18 00 C9 14 40 00 ...荥....@. 0018FE84 3C FF 18 00 00 00 00 00 00 E0 FD <........帻 0018FE8F 7E CC CC CC CC CC CC CC CC CC CC ~烫烫烫烫烫 0018FE63 CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫. 0018FE6E CC CC CC CC CC CC 48 3A 71 00 E4 烫烫烫H:q.. 0018FE79 FE 18 00 DC FE 18 00 C9 14 40 00 ...荥....@. 0018FE84 3C FF 18 00 00 00 00 00 00 E0 FD <........帻 0018FE6E CC CC CC CC CC CC 48 3A 71 00 E4 烫烫烫H:q.. 0018FE79 FE 18 00 DC FE 18 00 C9 14 40 00 ...荥....@. 0018FE84 3C FF 18 00 00 00 00 00 00 E0 FD <........帻 EAX = 00000001 EBX = 7EFDE000 ECX = 0018FF3C EDX = 0071015C ESI = 00000000 EDI = 0018FF3C EIP = 00401616 ESP = 0018FEE8 EBP = 0018FF48 EFL = 00000206 40: return 0; 00401608 mov dword ptr [ebp-14h],0 0040160F mov dword ptr [ebp-4],0FFFFFFFFh 00401616 lea ecx,[ebp-10h] 00401619 call @ILT+60(CMyString::~CMyString) (00401041) 0040161E mov eax,dword ptr [ebp-14h] 41: } EAX = 00000001 EBX = 7EFDE000 ECX = 0018FF38 EDX = 0071015C ESI = 00000000 EDI = 0018FF3C EIP = 00401619 ESP = 0018FEE8 EBP = 0018FF48 EFL = 00000206 00401529 pop ecx 0040152A mov dword ptr [ebp-4],ecx 18: if(m_pString != NULL) 0040152D mov eax,dword ptr [ebp-4] 00401530 cmp dword ptr [eax],0 00401533 je CMyString::~CMyString+42h (00401552) 19: { 20: delete [] m_pString; 00401535 mov ecx,dword ptr [ebp-4] 00401538 mov edx,dword ptr [ecx] 0040153A mov dword ptr [ebp-8],edx 0040153D mov eax,dword ptr [ebp-8] 00401540 push eax 00401541 call operator delete (00401e10) 00401546 add esp,4 21: m_pString = NULL; 00401549 mov ecx,dword ptr [ebp-4] 0040154C mov dword ptr [ecx],0 22: } 23: } EAX = CCCCCCCC EBX = 7EFDE000 ECX = 0018FF38 EDX = 0071015C ESI = 00000000 EDI = 0018FEE0 EIP = 0040152A ESP = 0018FE8C EBP = 0018FEE0 EFL = 00000212 00401535 mov ecx,dword ptr [ebp-4] EAX = 0018FF38 EBX = 7EFDE000 ECX = 0018FF38 EDX = 0071015C ESI = 00000000 EDI = 0018FEE0 EIP = 00401538 ESP = 0018FE8C EBP = 0018FEE0 EFL = 00000206 00401538 mov edx,dword ptr [ecx] EAX = 0018FF38 EBX = 7EFDE000 ECX = 0018FF38 EDX = 00713A48 ESI = 00000000 EDI = 0018FEE0 EIP = 0040153A ESP = 0018FE8C EBP = 0018FEE0 EFL = 00000206 00401540 push eax 00401541 call operator delete (00401e10) EAX = 00713A48 EBX = 7EFDE000 ECX = 0018FF38 EDX = 00713A48 ESI = 00000000 EDI = 0018FEE0 EIP = 00401541 ESP = 0018FE88 EBP = 0018FEE0 EFL = 00000206
原文地址:http://blog.csdn.net/u011185633/article/details/44922215