2015-12-18 80 views
2

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

#include <iostream> 
using namespace std; 

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

在gdb中我分解主要和啓動的程序,就進入「測試」作爲輸入,並停止在該比較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寄存器?我預計它會包含我的意見。

+1

在所有可能的情況下,* rdi *包含一個指向's'對象的指針(與機器代碼相當的引用)。這是你調用的'operator =='重載的第一個參數。由於您請求了指針值的字符串表示,因此調試器決定這些不是ASCII字符,而是以八進制顯示其值。 – IInspectable

+1

考慮用'g ++ -S -fverbose-asm -O'編譯源代碼並查看生成的'.s'彙編程序flie –

回答

3

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

請注意,函數調用是operator==需要const char *參數。

std::string類定義operator==,需要一個const char *參數,這是什麼正在這裏調用,與RDI指向std::string對象的內存中表示,並與ESI參數。

什麼是在rdi寄存器?我預計它會包含我的意見。

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