用汇编的眼光看C++(之缺省模板、特化模板) (二)

2014-11-24 12:43:50 · 作者: · 浏览: 1

249: data p;

004013BD lea ecx,[ebp-10h]

004013C0 call @ILT+45(data::data) (00401032)

004013C5 mov dword ptr [ebp-4],0

250: data q;

004013CC lea ecx,[ebp-14h]

004013CF call @ILT+35(data::data) (00401028)

251: }

249: data p;

004013BD lea ecx,[ebp-10h]

004013C0 call @ILT+45(data::data) (00401032)

004013C5 mov dword ptr [ebp-4],0

250: data q;

004013CC lea ecx,[ebp-14h]

004013CF call @ILT+35(data::data) (00401028)

251: }

我们发现,第一个函数的call地址是0x00401032,第二个地址为0x00401028。但是这说明不了什么,因为第二个地址完全也可能是第一个模板类引申的。我们应该跟到每一个函数里面(其实这里的地址在VC下都是跳转地址)。

第一个变量的实际进入函数如下所示:

234: data() {printf("normal!\n");}

00401340 push ebp

00401341 mov ebp,esp

00401343 sub esp,44h

00401346 push ebx

00401347 push esi

00401348 push edi

00401349 push ecx

0040134A lea edi,[ebp-44h]

0040134D mov ecx,11h

00401352 mov eax,0CCCCCCCCh

00401357 rep stos dword ptr [edi]

00401359 pop ecx

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

0040135D push offset string "normal!\n" (0042607c)

00401362 call printf (00401540)

00401367 add esp,4

0040136A mov eax,dword ptr [ebp-4]

0040136D pop edi

0040136E pop esi

0040136F pop ebx

00401370 add esp,44h

00401373 cmp ebp,esp

00401375 call __chkesp (004023b0)

0040137A mov esp,ebp

0040137C pop ebp

0040137D ret

234: data() {printf("normal!\n");}

00401340 push ebp

00401341 mov ebp,esp

00401343 sub esp,44h

00401346 push ebx

00401347 push esi

00401348 push edi

00401349 push ecx

0040134A lea edi,[ebp-44h]

0040134D mov ecx,11h

00401352 mov eax,0CCCCCCCCh

00401357 rep stos dword ptr [edi]

00401359 pop ecx

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

0040135D push offset string "normal!\n" (0042607c)

00401362 call printf (00401540)

00401367 add esp,4

0040136A mov eax,dword ptr [ebp-4]

0040136D pop edi

0040136E pop esi

0040136F pop ebx

00401370 add esp,44h

00401373 cmp ebp,esp

00401375 call __chkesp (004023b0)

0040137A mov esp,ebp

0040137C pop ebp

0040137D ret

那么,第二个变量呢,同样需要跟入函数:

242: data() {printf("point!\n");}

00401430 push ebp

00401431 mov ebp,esp

00401433 sub esp,44h

00401436 push ebx

00401437 push esi

00401438 push edi

00401439 push ecx

0040143A lea edi,[ebp-44h]

0040143D mov ecx,11h

00401442 mov eax,0CCCCCCCCh

00401447 rep stos dword ptr [edi]

00401449 pop ecx

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

0040144D push offset string "point!\n" (00426074)

00401452 call printf (00401540)

00401457 add esp,4

0040145A mov eax,dword ptr [ebp-4]

0040145D pop edi

0040145E pop