C++汇编代码分析(用clang编译)

标签 c++ binary clang

我正在尝试弄清楚 C++ 二进制代码的样子,尤其是对于虚函数调用。我想出了一些奇怪的事情。我有以下 C++ 代码:

#include <iostream>

using namespace std;

class Base {
 public:
  virtual void print() { cout << "from base" << endl; }
};

class Derived : public Base {
 public:
  virtual void print() { cout << "from derived" << endl; }
};

int main() {
  Base *b;
  Derived d;
  d.print();
  b = &d;
  b->print();
  return 0;
}

我是用clang++编译的,然后用objdump:

00000000004008b0 <main>:
  4008b0:   55                      push   rbp
  4008b1:   48 89 e5                mov    rbp,rsp
  4008b4:   48 83 ec 20             sub    rsp,0x20
  4008b8:   48 8d 7d e8             lea    rdi,[rbp-0x18]
  4008bc:   c7 45 fc 00 00 00 00    mov    DWORD PTR [rbp-0x4],0x0
  4008c3:   e8 28 00 00 00          call   4008f0 <Derived::Derived()>
  4008c8:   48 8d 7d e8             lea    rdi,[rbp-0x18]
  4008cc:   e8 5f 00 00 00          call   400930 <Derived::print()>
  4008d1:   48 8d 7d e8             lea    rdi,[rbp-0x18]
  4008d5:   48 89 7d f0             mov    QWORD PTR [rbp-0x10],rdi
  4008d9:   48 8b 7d f0             mov    rdi,QWORD PTR [rbp-0x10]
  4008dd:   48 8b 07                mov    rax,QWORD PTR [rdi]
  4008e0:   ff 10                   call   QWORD PTR [rax]
  4008e2:   31 c0                   xor    eax,eax
  4008e4:   48 83 c4 20             add    rsp,0x20
  4008e8:   5d                      pop    rbp
  4008e9:   c3                      ret    
  4008ea:   66 0f 1f 44 00 00       nop    WORD PTR [rax+rax*1+0x0]

我的问题是为什么在汇编代码中,我们有以下代码:

  4008b8:   48 8d 7d e8             lea    rdi,[rbp-0x18]
  4008d1:   48 8d 7d e8             lea    rdi,[rbp-0x18]

最佳答案

main() 中的局部变量d 存储在位置[rbp-0x18]。这是在堆栈上为 main() 分配的自动存储空间。

lea    rdi,[rbp-0x18]

此行将d 的地址加载到rdi 寄存器中。按照惯例,Derived 的成员函数将 rdi 视为 this 指针。

关于C++汇编代码分析(用clang编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50340612/

相关文章:

c++ - (C/C++ 的 latex 数学解析

c - 从 C 中的二进制文件中读取 block 字节

c - 理解c中的汇编代码

c++ - 替换遗留的 DirectDraw 代码

c++ - 如何在 C++ 中获取二维动态数组的输入

c++ - std::algorithms 迭代 `std::vector<std::vector<something>>` 的友好方式

c++ - 为什么 std::bitset<8> 变量无法处理 11111111?

通过各种转换将二进制字节数组转换为整数的 C 库函数

objective-c - 尝试为 Mac 构建 Evernote SDK 总是会导致错误

clang - Clang TOT 一词指的是什么?