积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> 汇编
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | XP Embedded | Nucleus | 新产品 | 相关文章 | 综合技术 |
C++对象布局及多态实现之动态和强制转换
 
作者:kangbai   来源:赛迪网社区    点击数:182   更新时间:2008-5-14
您可以添加到网摘 让更多人关注此文章:

       从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进行解析。理解本文要讨论的知识并不需要有很完整的汇编知识,但必须了解起码的概念。

  下面我们看看引入虚继承后的影响。为了有所对比我们首先看看普通成员函数的调用情况。

  执行如下代码,它包括了对象的普通成员函数调用,类的静态成员函数调用、通过指针调用普通成员函数:

 

C010 obj;
            PRINT_OBJ_ADR(obj)
            obj.foo();
            C012::sfoo();
            C010 * pt = &obj;
            pt-> foo();

        结果如下:

 

obj's address is : 0012F843

 

      这是obj对象的内存地址。

  首先我们看看对象的普通成员函数调用,obj.foo();,对应的汇编代码为: 
 

00422E09 lea ecx,[ebp+FFFFF967h]
            00422E0F call 0041E289

  第1行把对象的地址存入ecx寄存器,执行完这行指令后,我们要以看到ecx中的值为0x0012F843,就是前面打印出的值。如果函数需要传递参数,我们还会在前面看到一些push指令。在第2行我们可以看到call的是一个直接的地址,这也就是静态绑定。即函数的调用地址在编译时已经被编译器决议。

  跟踪进去我们要以看到是一条跳转指令,继续执行可以看到真正的函数代码部分,如下(注:为了讨论方便我在第行前面加了一个行号):

 

01 00425FE0 push ebp
            02 00425FE1 mov ebp,esp
            03 00425FE3 sub esp,0CCh
            04 00425FE9 push ebx
            05 00425FEA push esi
            06 00425FEB push edi
            07 00425FEC push ecx
            08 00425FED lea edi,[ebp+FFFFFF34h]
            09 00425FF3 mov ecx,33h
            10 00425FF8 mov eax,0CCCCCCCCh
            11 00425FFD rep stos dword ptr [edi]
            12 00425FFF pop ecx
            13 00426000 mov dword ptr [ebp-8],ecx
            14 00426003 mov eax,dword ptr [ebp-8]
            15 00426006 mov byte ptr [eax],2
            16 00426009 pop edi
            17 0042600A pop esi
            18 0042600B pop ebx
            19 0042600C mov esp,ebp
            20 0042600E pop ebp
            21 0042600F ret

       我们看看第7行,把ecx寄存器入栈,后面4行初始化了函数的堆栈中的保存局部变量的部分。第12行弹出ecx值,到这里时ecx的值保持为在函数调用前存入的对象内存地址,第13行就是保存this指针的值,作为一个局部变量。这样我们就知道了VC7.1不是象传递普通函数那样通过压栈来传递this 指针,而是通过ecx寄存器来传递。第14、15行利用这个this指针给对象的成员变量进行了赋值。

  再看看静态成员函数调用的汇编代码:

00422E14 call 0041DD84

       非常直接,因为它不需要处理this指针,跟踪到函数的汇编代码,可以看到同样不需要处理this指针。具体的代码这里就不列出来了。

  再看看通过指针调用普通成员函数pt-> foo();,产生的汇编代码如下:

00422E25 mov ecx,dword ptr [ebp+FFFFF958h]
            00422E2B call 0041E289

        和通过对象调用普通成员函数的代码差不多。不过存对象地址到ecx寄存器地,是通过解引用pt指针来找到对象地址的。



相关文章
· 晶体管热阻测试系统的设计与实现[157]
· Virtex-5中动态DCM的设计方法[134]
· 使用C++构建嵌入式开发框架[208]
· C++ Builder构建算二十四点小游戏[221]
· Java基础:从C++转到Java需注意的地方[633]
热门评论排行
·VHDL设计中电路简化问题的
·ARM嵌入式系统基础教程(N
·江苏嵌入式Linux教育培训
·ARM处理器应用开发4步骤
·锐极LINUX驱动培训班定于

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
七零一所发布恶劣环境角度传感器
德州仪器推出四款最新配电开关
Altium设定全新三维PCB设计性
飞思卡尔进军上网本市场 推
08年11月实际芯片销售额创新低
节能环保备受关注 半导体照
半导体产业最终将存活并将再次蓬勃发展
电子元件业御寒过冬 静待行
台湾当局拨款60亿美元援助DRAM厂
Vishay Silico
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
[推荐]ARM开发板,非常适合...
[推荐]DSP2812开发板+...
[推荐]DSP2812开发板+...
超低价专业PCB/电路板打样 ...
超低价专业PCB/电路板打样 ...
PCB/电路板打样...
[原创]北京金鼎旺提供 23...
[原创]北京金鼎旺提供:RS4...
[原创]北京金鼎旺提供:Mod...
北京金鼎旺:在某电线电缆厂交联...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网