关于C++ new的汇编

cc_net 2013-08-27 11:07:21
本来不太懂汇编,最近看看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吗?
...全文
205 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2013-08-27
  • 打赏
  • 举报
回复
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 ,故而后面的通过它的访问也会正常。
cc_net 2013-08-27
  • 打赏
  • 举报
回复

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

我说的是执行完构造函数后回到main后面的几条语句。最后一句是把创建的对象的首地址赋给cla2,但是他前面5条mov,我看是eax,ecx都被设为0了,那么cla2不也是0 吗。后面通过cla2访问为什么又能访问到?

008C3F63 mov eax,dword ptr [cla2]
008C3F69 mov dword ptr [eax+4],1F4h

zara 2013-08-27
  • 打赏
  • 举报
回复
第一个问题,应该是反汇编器还不够只能或人性化的缘故吧,虽然 [cla] 应该是 [ebp-70] 的形式,对非首元素会被成 [ebp-70+04] 这样的。
第二个问题,jmp 后面的几行是 008C3F0F call operator new (08C119Fh) 返回结果非 0 时执行的,即分配对象内存成功时执行的,就是执行对象的初始化功能嘛 call MyClass::MyClass 。
cc_net 2013-08-27
  • 打赏
  • 举报
回复
噢噢!明白了。非常感谢!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧