首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图

关于C++ new的汇编,该如何解决

2014-04-23 来源:读书人网 【读书人网(Reader8.cn):综合教育门户网站】
关于C++ new的汇编本来不太懂汇编,最近看看new实现的过程,看了下汇编有些不懂的地方。MyClass cla008C3EC9

关于C++ new的汇编
本来不太懂汇编,最近看看new实现的过程,看了下汇编有些不懂的地方。


MyClass cla;
008C3EC9  lea         ecx,[cla]  
008C3ECC  call        MyClass::MyClass (08C1050h)  
008C3ED1  mov         dword ptr [ebp-4],0  
cla.num5 = 500;
008C3ED8  mov         dword ptr [ebp-6Ch],1F4h  
int b4 = cla.num4;
008C3EFB  mov         eax,dword ptr [cla]  
008C3EFE  mov         dword ptr [b4],eax  
int b5 = cla.num5;
008C3F04  mov         eax,dword ptr [ebp-6Ch]  
008C3F07  mov         dword ptr [b5],eax  

第一个问题是,我class中有num4,num5两个变量,为什么第一变量访问的时候是用【cla】而第二个是用【ebp-6ch】而不是用【cla+4】? 如果对象是在堆上分配,我看访问变量就是以cla为base来访问的。


MyClass* cla2 = new MyClass();
008C3F0D  push        8  
008C3F0F  call        operator new (08C119Fh)  
008C3F14  add         esp,4  
008C3F17  mov         dword ptr [ebp-1FCh],eax  
008C3F1D  mov         byte ptr [ebp-4],1  
008C3F21  cmp         dword ptr [ebp-1FCh],0  
008C3F28  je          wmain+0FDh (08C3F3Dh)  
008C3F2A  mov         ecx,dword ptr [ebp-1FCh]  
008C3F30  call        MyClass::MyClass (08C1050h)  
008C3F35  mov         dword ptr [ebp-210h],eax  
008C3F3B  jmp         wmain+107h (08C3F47h)  
008C3F3D  mov         dword ptr [ebp-210h],0  
008C3F47  mov         eax,dword ptr [ebp-210h]  
008C3F4D  mov         dword ptr [ebp-208h],eax  
008C3F53  mov         byte ptr [ebp-4],0  
008C3F57  mov         ecx,dword ptr [ebp-208h]  
008C3F5D  mov         dword ptr [cla2],ecx  

第二个问题是,new了之后,jmp后面的4行不太懂,不是吧eax,ecx, [ebp-210h],[ebp-208h]都设置为0了吗,最后把ecx赋给cla2,那这个指针不也是0吗? 

[解决办法]
eax/ecx 置 0 是由于 008C3F3D  mov  dword ptr [ebp-210h],0 吧,但你没有注意上面的执行流程啊,这个指令只是由 008C3F28 je wmain+0FDh (08C3F3Dh) 转移过来执行,就是上面所说的对象内存分配失败时;若是正常的成功了的话,就会因 008C3F3B jmp wmain+107h (08C3F47h)跳过去了,而 [ebp-210] 也会被上一指令 008C3F35 mov dword ptr [ebp-210h],eax 设为正常的值。所以,实际运行时,若正常,cla2 就不会为 0 ,故而后面的通过它的访问也会正常。