分解一个简单的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并启动程序,输入"测试"作为输入,并在比较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
对象中,这就是所指向的内容。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 一种在C++中读取TXT配置文件的简单方法
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 显示错误输出的简单数组排序程序
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 退出简单while循环时出现问题
- 为什么简单的算术减法在"if"条件下不起作用?
- C++-字符串是否包含一个带有简单循环的单词
- 关于 c++ 函数中指针赋值的简单问题
- 从函数返回任意简单类型的数据
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 有没有办法简单地从 GPU 调用多个 cpp 输出文件?
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法