我有一个简单的C ++程序:
#include <iostream>
using namespace std;
int main(){
string s;
cin >> s;
if (s == "almafa")
cout << "ok";
}
在gdb中,我反汇编了main并启动了程序,进入了&#39;测试&#39;作为输入,并在比较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寄存器中有什么?我预计它会包含我的输入。
答案 0 :(得分:3)
rdi是指向std::string
对象的指针。
请注意,函数调用是operator==
的{{1}}参数。
const char *
类定义了一个带有std::string
参数的operator==
,这是在这里调用的,rdi指向{{1}的内存中表示对象,以及esi。
rdi寄存器中有什么?我预计它会包含我的输入。
这不是你的意见。您的输入存储在const char *
对象中,这就是指向的内容。