分解一个简单的C++程序

Disassembling a simple C++ program

本文关键字:简单 C++ 程序 一个 分解      更新时间:2023-10-16

我有一个简单的C++程序:

#include <iostream>
using namespace std;
int main(){
    string s;
    cin >> s; 
    if (s == "almafa")
        cout << "ok";
}

在gdb中,我分解main并启动程序,输入"测试"作为输入,并在比较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: "320335377377377177"

rdi寄存器中有什么?我原以为它会包含我的意见。

rdi是指向std::string对象的指针。

注意,函数调用是对采用const char *参数的operator==的调用。

std::string类定义了一个接受const char *参数的operator==,这就是这里调用的内容,rdi指向std::string对象的内存表示,参数在esi中。

rdi寄存器中有什么?我原以为它会包含我的意见。

这不是你的意见。您的输入存储在std::string对象中,这就是所指向的内容。