簡體   English   中英

C ++匯編代碼分析(與clang編譯)

[英]C++ assembly code analysis (compiled with 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指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM