Неожиданный результат на mov для той же переменной x86 - PullRequest
1 голос
/ 06 июня 2019

Я отлаживаю некоторый код C в GDB и разобрал его в код x86. Вот фрагмент

enter image description here Обратите внимание, что для понимания я написал следующую команду в консоли - следующая команда - mov 0x10 (% rdx),% rdx`

Как я понимаю режимы обращения к памяти, для mov 0x10(%rdx), %rdx мы сначала берем значение в %rdx, равное 0x604300, добавляем к нему 0x10, что дает нам 0x604310. Теперь это место в памяти, на которое мы должны посмотреть, какое значение мы хотим. Теперь, если мы посмотрим внутрь 0x604310, мы увидим ответ d32 или 0x20. Теперь мы переместим это значение в %rdx.

Однако после выполнения этой команды и перехода к следующей строке я печатаю значение $ rdx, которое равно d6308640 или 0x604320.

Как это возможно? Мое понимание неверно? Я не в курсе.

1 Ответ

1 голос
/ 06 июня 2019

Ваша команда x сбросила только 1 байт, но ваша инструкция mov загрузила 8 байт. Младший байт 0x20, потому что x86 имеет младший порядок. (Ваш ручной адрес рассчитан правильно).

Используйте help x, чтобы увидеть, какие модификаторы вы можете использовать для разных размеров, и чтобы сбросить несколько элементов.

Когда вы используете print $rdx, это десятичное число не шестнадцатеричное. Это совпадение, что младшие 2 цифры равны 40, что похоже на 0x20. (Но вы уже поняли это, и да, шестнадцатеричное представление заканчивается на 0x20).

Используйте p /x $rdx для печати значений reg в шестнадцатеричном формате. Или используйте layout reg, чтобы использовать режим TUI с разборкой и зарегистрировать «окна» внутри терминала.

Также я бы предложил si (пошаговые инструкции) вместо ni, который переходит через вызовы. Но и то, и другое хорошо, если вы знаете, что они делают, при условии, что вы n и s не будете переходить к исходной строке C, когда вы собираетесь выполнять инструкции.

...