`
kenby
  • 浏览: 723791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++虚函数调用的汇编过程

阅读更多

下面的程序改编自《Thinking in C++》的Instrument4.cpp

对其反汇编得到调用虚函数w->wind()的过程如下:

解释如下:

Begin
w = 0x97b1008
&w = 0xbfab8bbc
*w = 0x80489f0

mov -0xc(%ebp),%eax
%eax = w = 0x97b1008
是一个指针,同this一样,都指向Wind对象的首地址,也指向Wind对象的vptr。

mov (%eax),%eax
%eax = vptr = *w = 0x80489f0
此时%eax存的是vptr,初始时vptr指向VTABLE的首地址

add $0x4,%eax
%eax = vptr + 4 = 0x80489f4
让vptr加4,这样就指向VTABLE的第二项,第二项存放第二个虚函数的首地址

mov (%eax),%edx
%edx = *(vptr + 4) = 0x8048828
取得第二个虚拟函数的首地址,存到寄存器%edx

mov -0xc(%ebp),%eax
mov %eax,(%esp)
把隐藏参数w,也可以说this压栈

call *%edx
调用第二个虚拟函数,即Wind对象的what()

最后调用完w->wind()后,系统会重置vptr的值,使其重新指向VTABLE的首地址

上面的程序是通过派生类的指针来调用虚函数的,如果通过基类的指针来调用虚函数,情况又会怎样呢?请看下例:

分享到:
评论

相关推荐

    C++虚函数调用的反汇编解析

    C++虚函数调用的反汇编解析

    C++虚函数调用机制初探

    ### C++虚函数调用机制初探 #### 引言 C++作为一种强大的面向对象编程语言,其核心特性之一便是支持多态性(polymorphism)。多态性允许程序员使用基类类型的指针或引用调用派生类的成员函数,这种能力极大地增强了...

    深入C++虚表(虚函数 虚表 反汇编)

    这些知识有助于开发者更深入地理解C++多态性的底层实现机制,并为进一步探索如多继承下的虚函数调用、动态链接库(DLL)实现机制等更复杂的问题打下了坚实的基础。 通过学习和掌握反汇编技术,不仅可以帮助我们更好地...

    visual c++中函数调用方式浅探

    `__thiscall` 用于C++虚函数调用,简化了`this` 指针的管理;`naked call` 则为开发者提供了最低级别的控制权。在实际开发过程中,根据项目的需求选择合适的调用约定,可以在保证程序功能的同时提高程序的执行效率。

    实例分析C++的虚表的查看,使用,调用虚函数

    用c++类的实例解析虚函数表,查看虚表的地址,利用虚函数表中的地址调用虚函数实现C++中的多态特性, 此例是解析虚函数中简单易于理解的示例,重要的地方具有详细的注释。亲测可用,若有不清除的地方,可以留言,...

    c++转汇编的小测试

    比如,虚函数调用会在汇编中产生额外的间接跳转,模板可能导致代码膨胀,而对象的构造和析构会涉及到内存管理指令。 此外,C++的异常处理在汇编中也有特殊的体现,通常会包含`try`/`catch`块的处理机制。这通常涉及...

    从汇编角度看虚函数和普通成员函数的调用过程

    在C++编程中,成员函数是类的重要组成部分,它们提供了操作和访问类对象的能力。根据功能和特性,成员函数可以分为...为了更深入地了解这些概念,可以通过阅读汇编代码或者编写测试用例,观察不同成员函数调用的细节。

    浅析C++类的底层实现

    在本文中,我们将深入探讨C++类的封装性,以及其背后的构造函数、静态变量、虚函数等核心概念。 首先,我们来理解C++中的封装性。封装是面向对象编程的三大特性之一,它允许我们将数据和操作这些数据的函数捆绑在...

    如何获取C++类成员虚函数地址的示例代码

    总结,获取C++虚函数地址的方法包括直接通过成员函数指针、使用内联汇编以及访问虚函数表。理解这些机制对于深入理解C++的虚函数机制和运行时类型信息的使用非常重要。不过,需要注意的是,这些操作通常属于底层编程...

    浅谈C++ 虚函数分析

    在本篇文章中,我们将深入探讨C++虚函数的工作原理、使用方式以及其实现机制。 首先,虚函数的声明是在函数前加上`virtual`关键字。例如,`virtual int fuck(int a)`声明了一个虚函数,它接收一个整型参数并返回...

    x86逆向 - 虚函数1

    在x86架构下,虚函数调用通常有两种形式: 1. `call [xxx]` - 这种形式直接通过内存地址调用函数,其中`xxx`代表虚表中的地址。 2. `call reg` - 这种形式通过寄存器间接调用函数,寄存器中存储的是虚表的地址。 ...

    虚函数的真相(VC编译器如何实现“virtual ”规则)

    当我们通过基类指针调用虚函数时,实际的调用过程会通过这个表找到正确的函数地址。 下面,我们看一个实践例子,通过反汇编代码来揭示这个过程。假设我们创建了一个`Base`和`Derived`的对象,并通过基类指针调用`...

    通过反汇编理解 C++语言实质探讨

    3. **虚函数表的作用**:虚函数表是实现多态的关键,它允许在运行时动态地确定应调用哪个版本的虚函数。 通过这种方式,我们不仅能够理解面向对象编程的核心概念,还能深入洞察C++语言底层的实现细节。这对于提高...

    C++汇编

    这一过程不仅涉及到语法结构的变化,还包括数据类型转换、函数调用机制等方面。例如,以下C++代码片段: ```cpp void InitFun(Function* pFun) { pFun->SetAge(22); pFun->SetName("Tcliuqiang"); } ``` 编译为...

    The implementation mechanism for C++ virtual function

    本文将深入探讨C++虚函数的实现机制。 首先,虚函数是在基类中声明的,并由派生类继承和重写。它们具有相同的函数名、参数列表和返回类型,这是实现多态性的前提条件。虚函数必须通过基类对象的指针或引用来调用,...

    c++题目以及汇编,面试题目

    这是一个关于虚函数和对象指针类型的题目。`print(A a)`函数传递的是值,所以实际调用的是`A::print`。`main`函数中,`pa`、`pb`和`pc`都指向`A`类型,即使它们实际上可能指向`B`或`C`的实例。因此,`pa`调用`A::...

Global site tag (gtag.js) - Google Analytics