GDB сравнивает существующий символ с несуществующим символом? - PullRequest
0 голосов
/ 09 ноября 2018

В настоящее время я пытаюсь отточить свои навыки чтения ассемблера в GDB, и я столкнулся с какой-то странностью при попытке прочитать символ в GDB, и я не уверен, что происходит.

Для некоторого контекста файл, на который я смотрю, скомпилирован, функции .c нет, хотя код был скомпилирован в c. По сути, это файл назначения «бомба», в котором требуются определенные входные данные для перехода к следующему разделу кода, и этот код получен в результате тестирования одного из входных данных на предмет того, каким должен быть ответ.

Код, содержащий символ, который я пытаюсь прочитать, выглядит следующим образом:

cmp -0x1(%rbp),%al
je 0x400acf <nextpartofcode>

Я пытаюсь прочитать -0x1 (% rbp), поэтому я ввел print/c $rbp-1, чтобы попытаться посмотреть на него, и напечатал GDB: 175 '\257'. Предполагая, что этот вывод означал, что сравнение было бы успешным, если поместить в ASCII-символ 175, однако, когда я ввел символ (он выглядит как >>), он был показан как -62 '\302'.

Я также попытался прочитать значение как целое число, восьмеричное значение, десятичное значение, строку и шестнадцатеричное значение с таким же успехом, и я потерял все то, что я могу попробовать. Что именно здесь происходит? Я смотрю не в том месте (то есть -0x1 (% rbp) не $ rbp-1)? Я читаю значение как что-то не то (мне сказали, что это должен быть символ, но это что-то еще)? Должен ли я искать в другом месте значение? Я застрял, и я был бы признателен за любые указания.

1 Ответ

0 голосов
/ 09 ноября 2018

$rbp-1 - адрес; Вы должны разыменовать это. (Используйте команду GDB x для eXamine памяти по адресу или используйте синтаксис C для разыменования указателя на print, например p /c *(char*)($rbp-1).

Вы печатали младший байт адреса как символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...