技术_c++类_研究
北冥工作室吧
全部回复
仅看楼主
level 6
#include
class cppclass{private: int i;public: cppclass(); void cppout();};cppclass::cppclass(){ i=5;}void cppclass::cppout(){ cout<
2: class cppclass3: {4: private:5: int i;6: public:7: cppclass();8: void cppout();9: };10: cppclass::cppclass()11: {00401030 55 push e
bp
00401031 8B EC mov ebp,esp00401033 83 EC 44 sub esp,44h00401036 53 push ebx00401037 56 push esi00401038 57 push edi00401039 51 push ecx0040103A 8D 7D BC lea edi,[ebp-44h]0040103D B9 11 00 00 00 mov ecx,11h00401042 B8 CC CC CC CC mov eax,0CCCCCCCCh00401047 F3 AB rep stos dword ptr [edi]00401049 59 pop ecx0040104A 89 4D FC mov dword ptr [ebp-4],ecx12: i=5;0040104D 8B 45 FC mov eax,dword ptr [ebp-4]00401050 C7 00 05 00 00 00 mov dword ptr [eax],513: }00401056 8B 45 FC mov eax,dword ptr [ebp-4]00401059 5F pop edi0040105A 5E pop esi0040105B 5B pop ebx0040105C 8B E5 mov esp,ebp0040105E 5D pop ebp0040105F C3 ret14: void cppclass::cppout()15: {00401070 55 push ebp00401071 8B EC mov ebp,esp00401073 83 EC 44 sub esp,44h00401076 53 push ebx00401077 56 push esi00401078 57 push edi00401079 51 push ecx0040107A 8D 7D BC lea edi,[ebp-44h]0040107D B9 11 00 00 00 mov ecx,11h00401082 B8 CC CC CC CC mov eax,0CCCCCCCCh00401087 F3 AB rep stos dword ptr [edi]00401089 59 pop ecx0040108A 89 4D FC mov dword ptr [ebp-4],ecx16: cout<
2006年05月28日 09点05分 1
level 6
004010A0 83 C4 44 add esp,44h004010A3 3B EC cmp ebp,esp004010A5 E8 B6 23 00 00 call __chkesp (00403460)004010AA 8B E5 mov esp,ebp004010AC 5D pop ebp004010AD C3 ret18: void main()19: {004010C0 55 push ebp004010C1 8B EC mov ebp,esp004010C3 83 EC 44 sub esp,44h004010C6 53 push ebx004010C7 56 push esi004010C8 57 push edi004010C9 8D 7D BC lea edi,[ebp-44h]004010CC B9 11 00 00 00 mov ecx,11h004010D1 B8 CC CC CC CC mov eax,0CCCCCCCCh004010D6 F3 AB rep stos dword ptr [edi]20: cppclass a;004010D8 8D 4D FC lea ecx,[ebp-4]004010DB E8 25 FF FF FF call @ILT+0(cppclass::cppclass) (00401005)21: a.cppout();004010E0 8D 4D FC lea ecx,[ebp-4]004010E3 E8 22 FF FF FF call @ILT+5(cppclass::cppout) (0040100a)22: }004010E8 5F pop edi004010E9 5E pop esi004010EA 5B pop ebx004010EB 83 C4 44 add esp,44h004010EE 3B EC cmp ebp,esp004010F0 E8 6B 23 00 00 call __chkesp (00403460)004010F5 8B E5 mov esp,ebp004010F7 5D pop ebp004010F8 C3 ret在main()函数运行时,创建类时跳转到了类的构建函数调用完返回!通过例子可以看出,函数一直在调用类的成员函数,类在那儿进行初始化?为此设计这样例子,00401093 B9 C0 89 42 00 mov ecx,offset cout (004289c0)00401098 E8 73 00 00 00 call ostream::operator<< (00401110)004010E3 B9 C0 89 42 00 mov ecx,offset cout (004289c0)004010E8 E8 23 00 00 00 call ostream::operator<< (00401110)可以看到004289c0 地址是初始化i的地址。 
2006年05月28日 09点05分 2
level 6
27: void main()28: {00401120 55 push ebp00401121 8B EC mov ebp,esp00401123 83 EC 44 sub esp,44h00401126 53 push ebx00401127 56 push esi00401128 57 push edi00401129 8D 7D BC lea edi,[ebp-44h]0040112C B9 11 00 00 00 mov ecx,11h00401131 B8 CC CC CC CC mov eax,0CCCCCCCCh00401136 F3 AB rep stos dword ptr [edi]29: cppclass1 a;00401138 8D 4D FC lea ecx,[ebp-4]0040113B E8 D4 FE FF FF call @ILT+15(cppclass1::cppclass1) (00401014)30: a.cppout();00401140 8D 4D FC lea ecx,[ebp-4]00401143 E8 BD FE FF FF call @ILT+0(cppclass1::cppout) (00401005)31: }00401148 5F pop edi00401149 5E pop esi0040114A 5B pop ebx0040114B 83 C4 44 add esp,44h0040114E 3B EC cmp ebp,esp00401150 E8 BB 23 00 00 call __chkesp (00403510)00401155 8B E5 mov esp,ebp00401157 5D pop ebp00401158 C3 ret23: void cppclass1::cppout()24: {004010D0 55 push ebp004010D1 8B EC mov ebp,esp004010D3 83 EC 44 sub esp,44h004010D6 53 push ebx004010D7 56 push esi004010D8 57 push edi004010D9 51 push ecx004010DA 8D 7D BC lea edi,[ebp-44h]004010DD B9 11 00 00 00 mov ecx,11h004010E2 B8 CC CC CC CC mov eax,0CCCCCCCCh004010E7 F3 AB rep stos dword ptr [edi]004010E9 59 pop ecx004010EA 89 4D FC mov dword ptr [ebp-4],ecx25: cout<
2: class cppclass3: {4: public:5: int i;6: cppclass();7: void cppout();8: };9: class cppclass1:public cppclass10: {11: public:12: void cppout();13:14: };15: cppclass::cppclass()16: {00401040 55 push ebp00401041 8B EC mov ebp,esp00401043 83 EC 44 sub esp,44h00401046 53 push ebx00401047 56 push esi00401048 57 push edi00401049 51 push ecx0040104A 8D 7D BC lea edi,[ebp-44h]0040104D B9 11 00 00 00 mov ecx,11h00401052 B8 CC CC CC CC mov eax,0CCCCCCCCh00401057 F3 AB rep stos dword ptr [edi]00401059 59 pop ecx0040105A 89 4D FC mov dword ptr [ebp-4],ecx17: i=6;0040105D 8B 45 FC mov eax,dword ptr [ebp-4]00401060 C7 00 06 00 00 00 mov dword ptr [eax],618: }00401066 8B 45 FC mov eax,dword ptr [ebp-4]00401069 5F pop edi0040106A 5E pop esi0040106B 5B pop ebx0040106C 8B E5 mov esp,ebp0040106E 5D pop ebp0040106F C3 ret
2006年05月28日 09点05分 3
level 6
@ILT+0(?cppout@cppclass1@@QAEXXZ):00401005 E9 C6 00 00 00 jmp cppclass1::cppout (004010d0)@ILT+5(??0cppclass@@QAE@XZ):0040100A E9 31 00 00 00 jmp cppclass::cppclass (00401040)@ILT+10(?cppout@cppclass@@QAEXXZ):0040100F E9 6C 00 00 00 jmp cppclass::cppout (00401080)@ILT+15(??0cppclass1@@QAE@XZ):00401014 E9 57 01 00 00 jmp cppclass1::cppclass1 (00401170)@ILT+20(_main):00401019 E9 02 01 00 00 jmp main (00401120)
2006年05月28日 09点05分 4
1