簡體   English   中英

分解一個簡單的C ++程序

[英]Disassembling a simple C++ program

我有一個簡單的C ++程序:

#include <iostream>
using namespace std;

int main(){
    string s;
    cin >> s; 
    if (s == "almafa")
        cout << "ok";
}

在gdb中,我反匯編main並啟動程序,輸入“ testing”作為輸入,並在比較0x0000000000400bb7處停止:

   0x0000000000400bab <+53>:    lea    -0x40(%rbp),%rax
   0x0000000000400baf <+57>:    mov    $0x400d24,%esi
   0x0000000000400bb4 <+62>:    mov    %rax,%rdi
   0x0000000000400bb7 <+65>:    callq  0x400c6a <bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)>

我檢查了esi和rdi寄存器:

(gdb) x/s $esi
0x400d24:   "almafa"
(gdb) x/s $rdi
0x7fffffffddc0: "\320\335\377\377\377\177"

rdi寄存器中有什么? 我希望它將包含我的輸入。

rdi是指向std::string對象的指針。

請注意,函數調用是對使用const char *參數的operator==進行的。

std::string類定義一個帶const char *參數的operator== ,這就是這里要調用的內容,其中rdi指向std::string對象的內存表示形式,並且參數位於esi中。

rdi寄存器中有什么? 我希望它將包含我的輸入。

這不是您的輸入。 您的輸入存儲在std::string對象中,這就是這里指向的內容。

暫無
暫無

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

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