现在的位置: 首页 > 综合 > 正文

[利用asm代码学习c++语法]--继承、虚函数表

2013年12月07日 ⁄ 综合 ⁄ 共 16167字 ⁄ 字号 评论关闭

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:

#include <stdio.h>
struct B
{
 virtual int do_pv()=0;
 virtual int do_v(){return 1;}
 int do_nv(){return 2;}
};
struct D1:public B
{
 int do_pv(){return 3;}
 int do_nv(){return 4;}
};
struct D2:public B
{
 int do_pv(){return 5;}
 int do_nv(){return 6;}
};
struct DD:public D1,public D2
{
};
int main(int argc, char* argv[])
{
 DD *t = new DD;
 D1 *pd1 = t;
 printf("DD.do_pv()=%d/n", pd1->do_pv());
 printf("DD.do_nv()=%d/n", pd1->do_nv());
 printf("DD.do_v()=%d/n", pd1->do_v());
 D2 *pd2 = t;
 printf("DD.do_pv()=%d/n", pd2->do_pv());
 printf("DD.do_nv()=%d/n", pd2->do_nv());
 printf("DD.do_v()=%d/n", pd2->do_v());
 B *pb = dynamic_cast<B*>(t);
 pb = pd1 = new D1;
 printf("D1.do_pv()=%d/n", pb->do_pv());
 printf("D1.do_nv()=%d/n", pb->do_nv());
 printf("D1.do_v()=%d/n", pb->do_v());
 printf("D1.do_nv()=%d/n", pd1->do_nv());
 getchar();
 return 0;
}

; COMDAT _main
_TEXT SEGMENT
tv148 = -268      ; size = 4
tv88 = -268      ; size = 4
tv69 = -268      ; size = 4
$T3839 = -260      ; size = 4
$T3844 = -248      ; size = 4
_pb$ = -44      ; size = 4
_pd2$ = -32      ; size = 4
_pd1$ = -20      ; size = 4
_t$ = -8      ; size = 4
_argc$ = 8      ; size = 4
_argv$ = 12      ; size = 4
_main PROC      ; COMDAT

; 22   : {

 push ebp
 mov ebp, esp
 sub esp, 268    ; 0000010cH
 push ebx
 push esi
 push edi
 lea edi, DWORD PTR [ebp-268]
 mov ecx, 67     ; 00000043H
 mov eax, -858993460    ; ccccccccH
 rep stosd

; 23   :  DD *t = new DD;

 push 8
 call ??2@YAPAXI@Z    ; operator new
 add esp, 4
 mov DWORD PTR $T3839[ebp], eax
 cmp DWORD PTR $T3839[ebp], 0
 je SHORT $LN3@main
 mov ecx, DWORD PTR $T3839[ebp]
 call ??0DD@@QAE@XZ
 mov DWORD PTR tv69[ebp], eax
 jmp SHORT $LN4@main
$LN3@main:
 mov DWORD PTR tv69[ebp], 0
$LN4@main:
 mov eax, DWORD PTR tv69[ebp]
 mov DWORD PTR _t$[ebp], eax

; 24   :  D1 *pd1 = t;

 mov eax, DWORD PTR _t$[ebp]
 mov DWORD PTR _pd1$[ebp], eax

; 25   :  printf("DD.do_pv()=%d/n", pd1->do_pv());

 mov eax, DWORD PTR _pd1$[ebp]
 mov edx, DWORD PTR [eax]
 mov esi, esp
 mov ecx, DWORD PTR _pd1$[ebp]
 mov eax, DWORD PTR [edx]
 call eax;函数指针集中在虚函数表中,此处在编译期就确定了跳转位置
 cmp esi, esp
 call __RTC_CheckEsp
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@OEEAOFGP@DD?4do_pv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 26   :  printf("DD.do_nv()=%d/n", pd1->do_nv());

 mov ecx, DWORD PTR _pd1$[ebp]
 call ?do_nv@D1@@QAEHXZ   ; D1::do_nv;函数指针集中在虚函数表中,此处在编译期就确定了跳转位置
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@IAECHMIM@DD?4do_nv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 27   :  printf("DD.do_v()=%d/n", pd1->do_v());

 mov eax, DWORD PTR _pd1$[ebp]
 mov edx, DWORD PTR [eax]
 mov esi, esp
 mov ecx, DWORD PTR _pd1$[ebp]
 mov eax, DWORD PTR [edx+4];此处虚函数表的跳转位置与前面不同,但还是编译期确定
 call eax
 cmp esi, esp
 call __RTC_CheckEsp
 mov esi, esp
 push eax
 push OFFSET ??_C@_0O@FKMNCKLG@DD?4do_v?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 28   :  D2 *pd2 = t;

 cmp DWORD PTR _t$[ebp], 0
 je SHORT $LN5@main
 mov eax, DWORD PTR _t$[ebp]
 add eax, 4
 mov DWORD PTR tv88[ebp], eax
 jmp SHORT $LN6@main
$LN5@main:
 mov DWORD PTR tv88[ebp], 0
$LN6@main:
 mov ecx, DWORD PTR tv88[ebp]
 mov DWORD PTR _pd2$[ebp], ecx

; 29   :  printf("DD.do_pv()=%d/n", pd2->do_pv());

 mov eax, DWORD PTR _pd2$[ebp]
 mov edx, DWORD PTR [eax]
 mov esi, esp
 mov ecx, DWORD PTR _pd2$[ebp]
 mov eax, DWORD PTR [edx]
 call eax
 cmp esi, esp
 call __RTC_CheckEsp
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@OEEAOFGP@DD?4do_pv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 30   :  printf("DD.do_nv()=%d/n", pd2->do_nv());

 mov ecx, DWORD PTR _pd2$[ebp]
 call ?do_nv@D2@@QAEHXZ   ; D2::do_nv
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@IAECHMIM@DD?4do_nv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 31   :  printf("DD.do_v()=%d/n", pd2->do_v());

 mov eax, DWORD PTR _pd2$[ebp]
 mov edx, DWORD PTR [eax]
 mov esi, esp
 mov ecx, DWORD PTR _pd2$[ebp]
 mov eax, DWORD PTR [edx+4]
 call eax
 cmp esi, esp
 call __RTC_CheckEsp
 mov esi, esp
 push eax
 push OFFSET ??_C@_0O@FKMNCKLG@DD?4do_v?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 32   :  B *pb = dynamic_cast<B*>(t);

 push 0
 push OFFSET ??_R0?AUB@@@8
 push OFFSET ??_R0?AUDD@@@8
 push 0
 mov eax, DWORD PTR _t$[ebp]
 push eax
 call ___RTDynamicCast
 add esp, 20     ; 00000014H
 mov DWORD PTR _pb$[ebp], eax

; 33   :  pb = pd1 = new D1;

 push 4
 call ??2@YAPAXI@Z    ; operator new
 add esp, 4
 mov DWORD PTR $T3844[ebp], eax
 cmp DWORD PTR $T3844[ebp], 0
 je SHORT $LN7@main
 mov ecx, DWORD PTR $T3844[ebp]
 call ??0D1@@QAE@XZ
 mov DWORD PTR tv148[ebp], eax
 jmp SHORT $LN8@main
$LN7@main:
 mov DWORD PTR tv148[ebp], 0
$LN8@main:
 mov eax, DWORD PTR tv148[ebp]
 mov DWORD PTR _pd1$[ebp], eax
 mov ecx, DWORD PTR _pd1$[ebp]
 mov DWORD PTR _pb$[ebp], ecx

; 34   :  printf("D1.do_pv()=%d/n", pb->do_pv());

 mov eax, DWORD PTR _pb$[ebp]
 mov edx, DWORD PTR [eax]
 mov esi, esp
 mov ecx, DWORD PTR _pb$[ebp]
 mov eax, DWORD PTR [edx]
 call eax
 cmp esi, esp
 call __RTC_CheckEsp
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@IKIMDIEH@D1?4do_pv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 35   :  printf("D1.do_nv()=%d/n", pb->do_nv());

 mov ecx, DWORD PTR _pb$[ebp]
 call ?do_nv@B@@QAEHXZ   ; B::do_nv
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@OOIOKBKE@D1?4do_nv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 36   :  printf("D1.do_v()=%d/n", pb->do_v());

 mov eax, DWORD PTR _pb$[ebp]
 mov edx, DWORD PTR [eax]
 mov esi, esp
 mov ecx, DWORD PTR _pb$[ebp]
 mov eax, DWORD PTR [edx+4]
 call eax
 cmp esi, esp
 call __RTC_CheckEsp
 mov esi, esp
 push eax
 push OFFSET ??_C@_0O@PNBGOFCB@D1?4do_v?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 37   :  printf("D1.do_nv()=%d/n", pd1->do_nv());

 mov ecx, DWORD PTR _pd1$[ebp]
 call ?do_nv@D1@@QAEHXZ   ; D1::do_nv
 mov esi, esp
 push eax
 push OFFSET ??_C@_0P@OOIOKBKE@D1?4do_nv?$CI?$CJ?$DN?$CFd?6?$AA@
 call DWORD PTR __imp__printf
 add esp, 8
 cmp esi, esp
 call __RTC_CheckEsp

; 38   :  getchar();

 mov esi, esp
 call DWORD PTR __imp__getchar
 cmp esi, esp
 call __RTC_CheckEsp

; 39   :  return 0;

 xor eax, eax

; 40   : }

 pop edi
 pop esi
 pop ebx
 add esp, 268    ; 0000010cH
 cmp ebp, esp
 call __RTC_CheckEsp
 mov esp, ebp
 pop ebp
 ret 0
_main ENDP
?do_nv@B@@QAEHXZ PROC     ; B::do_nv, COMDAT
?do_nv@D1@@QAEHXZ PROC     ; D1::do_nv, COMDAT
?do_nv@D2@@QAEHXZ PROC     ; D2::do_nv, COMDAT

 

PUBLIC ??_7DD@@6BD2@@@     ; DD::`vftable';虚函数表标识声明
PUBLIC ??_7DD@@6BD1@@@     ; DD::`vftable'
PUBLIC ??0D2@@QAE@XZ     ; D2::D2
PUBLIC ??_R4DD@@6BD1@@@    ; DD::`RTTI Complete Object Locator';运行时类型识别相关
PUBLIC ??_R3DD@@8     ; DD::`RTTI Class Hierarchy Descriptor'
PUBLIC ??_R2DD@@8     ; DD::`RTTI Base Class Array'
PUBLIC ??_R1A@?0A@EA@DD@@8    ; DD::`RTTI Base Class Descriptor at (0,-1,0,64)'
PUBLIC ??_R1A@?0A@EA@D1@@8    ; D1::`RTTI Base Class Descriptor at (0,-1,0,64)'
PUBLIC ??_R0?AUD1@@@8     ; D1 `RTTI Type Descriptor'
PUBLIC ??_R3D1@@8     ; D1::`RTTI Class Hierarchy Descriptor'
PUBLIC ??_R2D1@@8     ; D1::`RTTI Base Class Array'
PUBLIC ??_R1A@?0A@EA@B@@8    ; B::`RTTI Base Class Descriptor at (0,-1,0,64)'
PUBLIC ??_R3B@@8     ; B::`RTTI Class Hierarchy Descriptor'
PUBLIC ??_R2B@@8     ; B::`RTTI Base Class Array'
PUBLIC ??_R1A@?0A@EC@B@@8    ; B::`RTTI Base Class Descriptor at (0,-1,0,66)'
PUBLIC ??_R13?0A@EA@D2@@8    ; D2::`RTTI Base Class Descriptor at (4,-1,0,64)'
PUBLIC ??_R0?AUD2@@@8     ; D2 `RTTI Type Descriptor'
PUBLIC ??_R3D2@@8     ; D2::`RTTI Class Hierarchy Descriptor'
PUBLIC ??_R2D2@@8     ; D2::`RTTI Base Class Array'
PUBLIC ??_R1A@?0A@EA@D2@@8    ; D2::`RTTI Base Class Descriptor at (0,-1,0,64)'
PUBLIC ??_R13?0A@EC@B@@8    ; B::`RTTI Base Class Descriptor at (4,-1,0,66)'
PUBLIC ?do_pv@D1@@UAEHXZ    ; D1::do_pv
PUBLIC ?do_v@B@@UAEHXZ     ; B::do_v
PUBLIC ??_R4DD@@6BD2@@@    ; DD::`RTTI Complete Object Locator'
PUBLIC ?do_pv@D2@@UAEHXZ    ; D2::do_pv
; COMDAT ??_R4DD@@6BD2@@@
rdata$r SEGMENT
??_R4DD@@6BD2@@@ DD 00H     ; DD::`RTTI Complete Object Locator'
 DD 04H
 DD 00H
 DD FLAT:??_R0?AUDD@@@8
 DD FLAT:??_R3DD@@8
rdata$r ENDS
; COMDAT ??_R13?0A@EC@B@@8
rdata$r SEGMENT
??_R13?0A@EC@B@@8 DD FLAT:??_R0?AUB@@@8   ; B::`RTTI Base Class Descriptor at (4,-1,0,66)'
 DD 00H
 DD 04H
 DD 0ffffffffH
 DD 00H
 DD 042H
 DD FLAT:??_R3B@@8
rdata$r ENDS
; COMDAT ??_R1A@?0A@EA@D2@@8
rdata$r SEGMENT
??_R1A@?0A@EA@D2@@8 DD FLAT:??_R0?AUD2@@@8  ; D2::`RTTI Base Class Descriptor at (0,-1,0,64)'
 DD 01H
 DD 00H
 DD 0ffffffffH
 DD 00H
 DD 040H
 DD FLAT:??_R3D2@@8
rdata$r ENDS
; COMDAT ??_R2D2@@8
rdata$r SEGMENT
??_R2D2@@8 DD FLAT:??_R1A@?0A@EA@D2@@8  ; D2::`RTTI Base Class Array'
 DD FLAT:??_R1A@?0A@EA@B@@8
rdata$r ENDS
; COMDAT ??_R3D2@@8
rdata$r SEGMENT
??_R3D2@@8 DD 00H     ; D2::`RTTI Class Hierarchy Descriptor'
 DD 00H
 DD 02H
 DD FLAT:??_R2D2@@8
rdata$r ENDS
; COMDAT ??_R0?AUD2@@@8
_DATA SEGMENT
??_R0?AUD2@@@8 DD FLAT:??_7type_info@@6B@  ; D2 `RTTI Type Descriptor'
 DD 00H
 DB '.?AUD2@@', 00H
_DATA ENDS
; COMDAT ??_R13?0A@EA@D2@@8
rdata$r SEGMENT
??_R13?0A@EA@D2@@8 DD FLAT:??_R0?AUD2@@@8  ; D2::`RTTI Base Class Descriptor at (4,-1,0,64)'
 DD 01H
 DD 04H
 DD 0ffffffffH
 DD 00H
 DD 040H
 DD FLAT:??_R3D2@@8
rdata$r ENDS
; COMDAT ??_R1A@?0A@EC@B@@8
rdata$r SEGMENT
??_R1A@?0A@EC@B@@8 DD FLAT:??_R0?AUB@@@8  ; B::`RTTI Base Class Descriptor at (0,-1,0,66)'
 DD 00H
 DD 00H
 DD 0ffffffffH
 DD 00H
 DD 042H
 DD FLAT:??_R3B@@8
rdata$r ENDS
; COMDAT ??_R2B@@8
rdata$r SEGMENT
??_R2B@@8 DD FLAT:??_R1A@?0A@EA@B@@8   ; B::`RTTI Base Class Array'
rdata$r ENDS
; COMDAT ??_R3B@@8
rdata$r SEGMENT
??_R3B@@8 DD 00H     ; B::`RTTI Class Hierarchy Descriptor'
 DD 00H
 DD 01H
 DD FLAT:??_R2B@@8
rdata$r ENDS
; COMDAT ??_R1A@?0A@EA@B@@8
rdata$r SEGMENT
??_R1A@?0A@EA@B@@8 DD FLAT:??_R0?AUB@@@8  ; B::`RTTI Base Class Descriptor at (0,-1,0,64)'
 DD 00H
 DD 00H
 DD 0ffffffffH
 DD 00H
 DD 040H
 DD FLAT:??_R3B@@8
rdata$r ENDS
; COMDAT ??_R2D1@@8
rdata$r SEGMENT
??_R2D1@@8 DD FLAT:??_R1A@?0A@EA@D1@@8  ; D1::`RTTI Base Class Array'
 DD FLAT:??_R1A@?0A@EA@B@@8
rdata$r ENDS
; COMDAT ??_R3D1@@8
rdata$r SEGMENT
??_R3D1@@8 DD 00H     ; D1::`RTTI Class Hierarchy Descriptor'
 DD 00H
 DD 02H
 DD FLAT:??_R2D1@@8
rdata$r ENDS
; COMDAT ??_R0?AUD1@@@8
_DATA SEGMENT
??_R0?AUD1@@@8 DD FLAT:??_7type_info@@6B@  ; D1 `RTTI Type Descriptor'
 DD 00H
 DB '.?AUD1@@', 00H
_DATA ENDS
; COMDAT ??_R1A@?0A@EA@D1@@8
rdata$r SEGMENT
??_R1A@?0A@EA@D1@@8 DD FLAT:??_R0?AUD1@@@8  ; D1::`RTTI Base Class Descriptor at (0,-1,0,64)'
 DD 01H
 DD 00H
 DD 0ffffffffH
 DD 00H
 DD 040H
 DD FLAT:??_R3D1@@8
rdata$r ENDS
; COMDAT ??_R1A@?0A@EA@DD@@8
rdata$r SEGMENT
??_R1A@?0A@EA@DD@@8 DD FLAT:??_R0?AUDD@@@8  ; DD::`RTTI Base Class Descriptor at (0,-1,0,64)'
 DD 04H
 DD 00H
 DD 0ffffffffH
 DD 00H
 DD 040H
 DD FLAT:??_R3DD@@8
rdata$r ENDS
; COMDAT ??_R2DD@@8
rdata$r SEGMENT
??_R2DD@@8 DD FLAT:??_R1A@?0A@EA@DD@@8  ; DD::`RTTI Base Class Array'
 DD FLAT:??_R1A@?0A@EA@D1@@8
 DD FLAT:??_R1A@?0A@EC@B@@8
 DD FLAT:??_R13?0A@EA@D2@@8
 DD FLAT:??_R13?0A@EC@B@@8
rdata$r ENDS
; COMDAT ??_R3DD@@8
rdata$r SEGMENT
??_R3DD@@8 DD 00H     ; DD::`RTTI Class Hierarchy Descriptor'
 DD 05H
 DD 05H
 DD FLAT:??_R2DD@@8
rdata$r ENDS
; COMDAT ??_R4DD@@6BD1@@@
rdata$r SEGMENT
??_R4DD@@6BD1@@@ DD 00H     ; DD::`RTTI Complete Object Locator'
 DD 00H
 DD 00H
 DD FLAT:??_R0?AUDD@@@8
 DD FLAT:??_R3DD@@8
rdata$r ENDS
; COMDAT ??_7DD@@6BD2@@@
CONST SEGMENT
??_7DD@@6BD2@@@ DD FLAT:??_R4DD@@6BD2@@@  ; DD::`vftable';虚函数表的结构描述
 DD FLAT:?do_pv@D2@@UAEHXZ
 DD FLAT:?do_v@B@@UAEHXZ
CONST ENDS
; COMDAT ??_7DD@@6BD1@@@
CONST SEGMENT
??_7DD@@6BD1@@@ DD FLAT:??_R4DD@@6BD1@@@  ; DD::`vftable'
 DD FLAT:?do_pv@D1@@UAEHXZ
 DD FLAT:?do_v@B@@UAEHXZ
; Function compile flags: /Odtp /RTCsu /ZI
CONST ENDS
; COMDAT ??0DD@@QAE@XZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
??0DD@@QAE@XZ PROC     ; DD::DD, COMDAT
; _this$ = ecx
 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov ecx, DWORD PTR _this$[ebp]
 call ??0D1@@QAE@XZ
 mov ecx, DWORD PTR _this$[ebp]
 add ecx, 4
 call ??0D2@@QAE@XZ
 mov eax, DWORD PTR _this$[ebp]
 mov DWORD PTR [eax], OFFSET ??_7DD@@6BD1@@@
 mov eax, DWORD PTR _this$[ebp]
 mov DWORD PTR [eax+4], OFFSET ??_7DD@@6BD2@@@
 mov eax, DWORD PTR _this$[ebp]
 pop edi
 pop esi
 pop ebx
 add esp, 204    ; 000000ccH
 cmp ebp, esp
 call __RTC_CheckEsp
 mov esp, ebp
 pop ebp
 ret 0
??0DD@@QAE@XZ ENDP     ; DD::DD
; Function compile flags: /Odtp /RTCsu /ZI
_TEXT ENDS
; COMDAT ?do_v@B@@UAEHXZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
?do_v@B@@UAEHXZ PROC     ; B::do_v, COMDAT
; _this$ = ecx

; 5    :  virtual int do_v(){return 1;}

 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov eax, 1
 pop edi
 pop esi
 pop ebx
 mov esp, ebp
 pop ebp
 ret 0
?do_v@B@@UAEHXZ ENDP     ; B::do_v
; Function compile flags: /Odtp /RTCsu /ZI
_TEXT ENDS
; COMDAT ?do_pv@D1@@UAEHXZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
?do_pv@D1@@UAEHXZ PROC     ; D1::do_pv, COMDAT
; _this$ = ecx

; 10   :  int do_pv(){return 3;}

 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov eax, 3
 pop edi
 pop esi
 pop ebx
 mov esp, ebp
 pop ebp
 ret 0
?do_pv@D1@@UAEHXZ ENDP     ; D1::do_pv
; Function compile flags: /Odtp /RTCsu /ZI
_TEXT ENDS
; COMDAT ?do_pv@D2@@UAEHXZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
?do_pv@D2@@UAEHXZ PROC     ; D2::do_pv, COMDAT
; _this$ = ecx

; 15   :  int do_pv(){return 5;}

 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov eax, 5
 pop edi
 pop esi
 pop ebx
 mov esp, ebp
 pop ebp
 ret 0
?do_pv@D2@@UAEHXZ ENDP     ; D2::do_pv
_TEXT ENDS
PUBLIC ??_7D1@@6B@     ; D1::`vftable'
PUBLIC ??0B@@QAE@XZ     ; B::B
PUBLIC ??_R4D1@@6B@     ; D1::`RTTI Complete Object Locator'
; COMDAT ??_R4D1@@6B@
rdata$r SEGMENT
??_R4D1@@6B@ DD 00H     ; D1::`RTTI Complete Object Locator'
 DD 00H
 DD 00H
 DD FLAT:??_R0?AUD1@@@8
 DD FLAT:??_R3D1@@8
rdata$r ENDS
; COMDAT ??_7D1@@6B@
CONST SEGMENT
??_7D1@@6B@ DD FLAT:??_R4D1@@6B@   ; D1::`vftable'
 DD FLAT:?do_pv@D1@@UAEHXZ
 DD FLAT:?do_v@B@@UAEHXZ
; Function compile flags: /Odtp /RTCsu /ZI
CONST ENDS
; COMDAT ??0D1@@QAE@XZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
??0D1@@QAE@XZ PROC     ; D1::D1, COMDAT
; _this$ = ecx
 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov ecx, DWORD PTR _this$[ebp]
 call ??0B@@QAE@XZ
 mov eax, DWORD PTR _this$[ebp]
 mov DWORD PTR [eax], OFFSET ??_7D1@@6B@
 mov eax, DWORD PTR _this$[ebp]
 pop edi
 pop esi
 pop ebx
 add esp, 204    ; 000000ccH
 cmp ebp, esp
 call __RTC_CheckEsp
 mov esp, ebp
 pop ebp
 ret 0
??0D1@@QAE@XZ ENDP     ; D1::D1
_TEXT ENDS
PUBLIC ??_7D2@@6B@     ; D2::`vftable'
PUBLIC ??_R4D2@@6B@     ; D2::`RTTI Complete Object Locator'
; COMDAT ??_R4D2@@6B@
rdata$r SEGMENT
??_R4D2@@6B@ DD 00H     ; D2::`RTTI Complete Object Locator'
 DD 00H
 DD 00H
 DD FLAT:??_R0?AUD2@@@8
 DD FLAT:??_R3D2@@8
rdata$r ENDS
; COMDAT ??_7D2@@6B@
CONST SEGMENT
??_7D2@@6B@ DD FLAT:??_R4D2@@6B@   ; D2::`vftable'
 DD FLAT:?do_pv@D2@@UAEHXZ
 DD FLAT:?do_v@B@@UAEHXZ
; Function compile flags: /Odtp /RTCsu /ZI
CONST ENDS
; COMDAT ??0D2@@QAE@XZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
??0D2@@QAE@XZ PROC     ; D2::D2, COMDAT
; _this$ = ecx
 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov ecx, DWORD PTR _this$[ebp]
 call ??0B@@QAE@XZ
 mov eax, DWORD PTR _this$[ebp]
 mov DWORD PTR [eax], OFFSET ??_7D2@@6B@
 mov eax, DWORD PTR _this$[ebp]
 pop edi
 pop esi
 pop ebx
 add esp, 204    ; 000000ccH
 cmp ebp, esp
 call __RTC_CheckEsp
 mov esp, ebp
 pop ebp
 ret 0
??0D2@@QAE@XZ ENDP     ; D2::D2
_TEXT ENDS
PUBLIC ??_7B@@6B@     ; B::`vftable'
PUBLIC ??_R4B@@6B@     ; B::`RTTI Complete Object Locator'
EXTRN __purecall:PROC
; COMDAT ??_R4B@@6B@
rdata$r SEGMENT
??_R4B@@6B@ DD 00H     ; B::`RTTI Complete Object Locator'
 DD 00H
 DD 00H
 DD FLAT:??_R0?AUB@@@8
 DD FLAT:??_R3B@@8
rdata$r ENDS
; COMDAT ??_7B@@6B@
CONST SEGMENT
??_7B@@6B@ DD FLAT:??_R4B@@6B@   ; B::`vftable'
 DD FLAT:__purecall
 DD FLAT:?do_v@B@@UAEHXZ
; Function compile flags: /Odtp /RTCsu /ZI
CONST ENDS
; COMDAT ??0B@@QAE@XZ
_TEXT SEGMENT
_this$ = -8      ; size = 4
??0B@@QAE@XZ PROC     ; B::B, COMDAT
; _this$ = ecx
 push ebp
 mov ebp, esp
 sub esp, 204    ; 000000ccH
 push ebx
 push esi
 push edi
 push ecx
 lea edi, DWORD PTR [ebp-204]
 mov ecx, 51     ; 00000033H
 mov eax, -858993460    ; ccccccccH
 rep stosd
 pop ecx
 mov DWORD PTR _this$[ebp], ecx
 mov eax, DWORD PTR _this$[ebp]
 mov DWORD PTR [eax], OFFSET ??_7B@@6B@
 mov eax, DWORD PTR _this$[ebp]
 pop edi
 pop esi
 pop ebx
 mov esp, ebp
 pop ebp
 ret 0
??0B@@QAE@XZ ENDP     ; B::B
_TEXT ENDS
END

 

抱歉!评论已关闭.