用汇编的眼光看C++(之算术符重载) (二)

2014-11-24 12:43:50 · 作者: · 浏览: 1
(004012ad)

004012A6 mov dword ptr [ebp-24h],0

004012AD mov eax,dword ptr [ebp-24h]

004012B0 mov dword ptr [ebp-14h],eax

004012B3 mov dword ptr [ebp-4],0FFFFFFFFh

004012BA mov ecx,dword ptr [ebp-14h]

004012BD mov dword ptr [ebp-10h],ecx

73: delete d;

004012C0 mov edx,dword ptr [ebp-10h]

004012C3 mov dword ptr [ebp-20h],edx

004012C6 mov eax,dword ptr [ebp-20h]

004012C9 mov dword ptr [ebp-1Ch],eax

004012CC cmp dword ptr [ebp-1Ch],0

004012D0 je process+91h (004012e1)

004012D2 push 1

004012D4 mov ecx,dword ptr [ebp-1Ch]

004012D7 call @ILT+0(desk::`scalar deleting destructor') (00401005)

004012DC mov dword ptr [ebp-28h],eax

004012DF jmp process+98h (004012e8)

004012E1 mov dword ptr [ebp-28h],0

74: }

72: desk* d = new desk(10);

0040127D push 4

0040127F call @ILT+65(desk::operator new) (00401046)

00401284 add esp,4

00401287 mov dword ptr [ebp-18h],eax

0040128A mov dword ptr [ebp-4],0

00401291 cmp dword ptr [ebp-18h],0

00401295 je process+56h (004012a6)

00401297 push 0Ah

00401299 mov ecx,dword ptr [ebp-18h]

0040129C call @ILT+5(desk::desk) (0040100a)

004012A1 mov dword ptr [ebp-24h],eax

004012A4 jmp process+5Dh (004012ad)

004012A6 mov dword ptr [ebp-24h],0

004012AD mov eax,dword ptr [ebp-24h]

004012B0 mov dword ptr [ebp-14h],eax

004012B3 mov dword ptr [ebp-4],0FFFFFFFFh

004012BA mov ecx,dword ptr [ebp-14h]

004012BD mov dword ptr [ebp-10h],ecx

73: delete d;

004012C0 mov edx,dword ptr [ebp-10h]

004012C3 mov dword ptr [ebp-20h],edx

004012C6 mov eax,dword ptr [ebp-20h]

004012C9 mov dword ptr [ebp-1Ch],eax

004012CC cmp dword ptr [ebp-1Ch],0

004012D0 je process+91h (004012e1)

004012D2 push 1

004012D4 mov ecx,dword ptr [ebp-1Ch]

004012D7 call @ILT+0(desk::`scalar deleting destructor') (00401005)

004012DC mov dword ptr [ebp-28h],eax

004012DF jmp process+98h (004012e8)

004012E1 mov dword ptr [ebp-28h],0

74: }

上面是一段普通的new、delete使用代码。但是我们发现,简单的一个语句,在汇编器看来,却需要做这么多的内容,这是为什么呢,我们不妨来自习看一看:

72句:汇编中有两个函数调用,一个是new调用,也就是我们重定义的new函数,一个是构造函数,最后的几行代码主要是把构造函数返回指针赋值给一些临时变量,可忽略

73句:汇编中首先让指针和0进行了判断,然后调用了一个函数,似乎没有调用我们的delete函数,我们可以跟进去看一下:

desk::`scalar deleting destructor':

00401410 push ebp

00401411 mov ebp,esp

00401413 sub esp,44h

00401416 push ebx

00401417 push esi

00401418 push edi

00401419 push ecx

0040141A lea edi,[ebp-44h]

0040141D mov ecx,11h

00401422 mov eax,0CCCCCCCCh

00401427 rep stos dword ptr [edi]

00401429 pop ecx

0040142A mov dword ptr [ebp-4],ecx

0040142D mov ecx,dword ptr [ebp-4]

00401430 call @ILT+75(desk::~desk) (00401050)

00401435 mov eax,dword ptr [ebp+8]

00401438 and eax,1

0040143B test