当前位置:首页 > 工业控制 > 电子设计自动化
[导读]从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进

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

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

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

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 ebp02 00425FE1 mov ebp,esp03 00425FE3 sub esp,0CCh04 00425FE9 push ebx05 00425FEA push esi06 00425FEB push edi07 00425FEC push ecx08 00425FED lea edi,[ebp+FFFFFF34h]09 00425FF3 mov ecx,33h10 00425FF8 mov eax,0CCCCCCCCh11 00425FFD rep stos dword ptr [edi]12 00425FFF pop ecx13 00426000 mov dword ptr [ebp-8],ecx14 00426003 mov eax,dword ptr [ebp-8]15 00426006 mov byte ptr [eax],216 00426009 pop edi17 0042600A pop esi18 0042600B pop ebx19 0042600C mov esp,ebp20 0042600E pop ebp21 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指针来找到对象地址的。



来源:ks990次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

最近一则热帖在网上引起了热议,起因是一位网友向高学历人才发出了建议:回到小县城发展!原因如下:凭借高学历,能享受县城各方面福利,对象好找,房子不贵,可以过得很舒适。但在大城市就是干电池,996,房奴,连个对象都没有,跟以...

关键字: 高学历 机会 对象

前些日子,一家名为能斯达的企业获得小米长江产业基金1000万投资。此外在今年三月,该企业还获得易方新达创业投资、共青城国谦成长一号股权投资。据悉,该公司致力于柔性传感技术的研发和产业化,在消费电子、健康医疗、IOT等领域...

关键字: 能斯达 投资 布局

先直接抛出中心思想:俄罗斯做了初一(四州公投入俄+核威慑),就不要怪别国做十五(北溪管道炸洞)。不过,战争结局却清晰了:俄罗斯会占一些土地,却会失去欧洲,俄罗斯未来大概就是一个伪装成国家的大号加油站了。对于中国而言,以前...

关键字: 俄乌战争 高能耗产业 布局

在这篇文章中,小编将为大家带来工控主板的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 工控主板 布局 主板

对象类 一个类定义了一组对象。类具有行为(be-havoir),它描述一个对象能够做什么以及做的方法(method),它们是可以对这个对象进行操作的程序和过程。

关键字: 对象 行为

在生活中,你可能接触过各种各样的电子产品,那么你可能并不知道它的一些组成部分,比如它可能含有的开关电源,那么接下来让小编带领大家一起学习开关电源布局以及印制板布线的一些原则。

关键字: 开关电源 布局 印制板布线

分析好整个电路原理以后,就可以开始对整个电路进行布局布线,下面,给大家介绍一下布局的思路和原则。

关键字: PCB 布局 原则

一般PCB基本设计流程如下:前期准备→PCB结构设计→导网表→规则设置→PCB布局→布线→布线优化和丝印→网络和DRC检查和结构检查→输出光绘→光绘审查→PCB制板生产/打样资料→PCB板厂工程EQ确认→贴片资料输出→项...

关键字: PCB 布局 设计流程

本文罗列了各种不同的设计疏忽,探讨了每种失误导致电路故障的原因,并给出了如何避免这些设计缺陷的建议。

关键字: PCB 布局 电路故障

你知道组串式逆变器布局吗?随着全球多样化的发展,我们的生活也在不断变化着,包括我们接触的各种各样的电子产品,那么你一定不知道这些产品的一些组成,比如组串式逆变器。

关键字: 组串式 逆变器 布局
关闭
关闭