У меня есть простая программа на C++:Дизассемблирования простого C++ программы
#include <iostream>
using namespace std;
int main(){
string s;
cin >> s;
if (s == "almafa")
cout << "ok";
}
В БГДЕ я демонтировал основной и запустил программу, вошел «тестирование» в качестве входных данных, и остановился на 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*)>
Я проверил ЭРИ и RDI регистры:
(gdb) x/s $esi
0x400d24: "almafa"
(gdb) x/s $rdi
0x7fffffffddc0: "\320\335\377\377\377\177"
Что находится в регистре RDI? Я ожидал, что он будет содержать мои данные.
Вполне вероятно, что * rdi * содержит указатель (машинный код эквивалента ссылки) объекту 's'. Это первый аргумент в вызове 'operator ==' overload, который вы вызываете. Поскольку вы запросили строковое представление значения указателя, отладчик решил, что они не являются символами ASCII и вместо этого отображают свои значения в восьмеричном. – IInspectable
Рассмотрите возможность компиляции исходного кода с помощью 'g ++ -S -fverbose-asm -O' и посмотрите на сгенерированный ассемблер' .s' –