2015-12-18 2 views
2

У меня есть простая программа на 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? Я ожидал, что он будет содержать мои данные.

+1

Вполне вероятно, что * rdi * содержит указатель (машинный код эквивалента ссылки) объекту 's'. Это первый аргумент в вызове 'operator ==' overload, который вы вызываете. Поскольку вы запросили строковое представление значения указателя, отладчик решил, что они не являются символами ASCII и вместо этого отображают свои значения в восьмеричном. – IInspectable

+1

Рассмотрите возможность компиляции исходного кода с помощью 'g ++ -S -fverbose-asm -O' и посмотрите на сгенерированный ассемблер' .s' –

ответ

3

rdi - это указатель на ваш объект std::string.

Обратите внимание, что вызов функции равен operator==, который принимает параметр const char *.

std::string класса определяет operator==, который принимает параметр const char *, и это то, что быть вызвано здесь, с RDI, указывающим на представление в памяти std::string объекта, и с параметром в ЭСИ.

Что входит в регистр rdi? Я ожидал, что он будет содержать мои данные.

Это не ваш вход. Ваш вход был сохранен в объекте std::string, и вот что здесь указано.

Смежные вопросы