首页
社区
课程
招聘
[旧帖] [求助]C++虚函数表之汇编剖析 0.00雪花
发表于: 2012-9-29 11:18 1818

[旧帖] [求助]C++虚函数表之汇编剖析 0.00雪花

2012-9-29 11:18
1818
这几天在研究C++虚函数表的实现机制,有几个疑问还望大牛指教。
据析,一个C++类有了虚函数就会在只读节区生成一个虚函数表,比如这个类:
class CTest{
public:
	virtual ~CTest(){}

	virtual void Func1( int a, bool b, unsigned c ){
		a += b + c;
	}

	virtual void Func2( char a ){
		a += 10;
	}
};

会有这样的一个虚函数表:
CONST	SEGMENT
??_7CTest@@6B@ DD FLAT:??_R4CTest@@6B@	  ;RTTI
	DD	FLAT:??_ECTest@@UAEPAXI@Z     ;析构函数
	DD	FLAT:?Func1@CTest@@UAEXH_NI@Z
	DD	FLAT:?Func2@CTest@@UAEXD@Z
CONST	ENDS

其默认生成的构造函数如下:
??0CTest@@QAE@XZ PROC  ;CTest::CTest
; _this$ = ecx
	push	ebp
	mov	ebp, esp
	push	ecx
	mov	DWORD PTR _this$[ebp], ecx
	mov	eax, DWORD PTR _this$[ebp]
	mov	DWORD PTR [eax], OFFSET ??_7CTest@@6B@
	mov	eax, DWORD PTR _this$[ebp]
	mov	esp, ebp
	pop	ebp
	ret	0
??0CTest@@QAE@XZ ENDP	

对于以上的内容,我有几点疑惑:
1.定义虚函数表时,VC是这样定义的
??_7CTest@@6B@ DD FLAT:??_R4CTest@@6B@

FLAT是什么意思?
假如这样定义:
??_7CTest@@6B@ DD OFFSET ??_R4CTest@@6B@
行不行?
两者有什么区别?
2.对于CTest虚函数表,存放了四个地址,后三个是CTest的函数地址,第一个是RTTI结构信息地址,而VC生成CTest的默认构造函数中有这样一条指令
mov	DWORD PTR [eax], OFFSET ??_7CTest@@6B@
,这意思是说eax所指内存信息是CTest的RTTI结构信息地址咯,但是我在main函数里有这么一句C++代码
p1->Func1(2, 1, 4); //p1是CTest*类型

对应生成的汇编代码是
push	4
	push	1
	push	2
	mov	edx, DWORD PTR _p1$[ebp] ;_p1$[ebp]与C++中的指针p1相对应
	mov	eax, DWORD PTR [edx]
	mov	ecx, DWORD PTR _p1$[ebp]
	mov	edx, DWORD PTR [eax+4]
	call	edx

据之前分析,mov        edx, DWORD PTR [eax+4]这段代码是错的,应该是mov         edx, DWORD PTR [eax+8]才对,但VC为什么生成的只是让eax加4呢?

另:对于RTTI的具体实现原理还没弄明白,下一步准备好好研究一下,如果大牛哥好心,顺便给点提示
谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
没人理俺?
2012-10-23 19:56
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不能让帖子沉下去
2012-12-10 16:36
0
雪    币: 465
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢楼主...
2012-12-11 15:56
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
这个问题,时经多月,自己研究出来了,再顶下,然后结贴
2013-2-3 09:45
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
继续无条件顶下
2013-4-15 09:55
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
自己研究出来了
2013-11-23 23:38
0
雪    币: 3
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主给我讲讲好吗,我也想学习一下
2013-12-16 16:20
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
自己看C++代码生成的汇编代码,这样的学习最直接有效
2014-1-6 12:03
0
游客
登录 | 注册 方可回帖
返回
//