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寄存器?我預計它會包含我的意見。
在所有可能的情況下,* rdi *包含一個指向's'對象的指針(與機器代碼相當的引用)。這是你調用的'operator =='重載的第一個參數。由於您請求了指針值的字符串表示,因此調試器決定這些不是ASCII字符,而是以八進制顯示其值。 – IInspectable
考慮用'g ++ -S -fverbose-asm -O'編譯源代碼並查看生成的'.s'彙編程序flie –