Что означает адрес памяти в левом столбце и почему каждая инструкция имеет переменную ширину "между" следующим адресом?
Инструкции машинного кода x86 имеют переменную длину,Таким образом, некоторые инструкции занимают один байт, в то время как, например, movabs $0x12345678abcdef, %rax
занимает 10. Жесткий предел составляет 15 байтов, но только преднамеренное заполнение с избыточными префиксами может доходить до 15.
Многие другие архитектуры являются RISC иимеют инструкции фиксированной ширины.
Что означает второй столбец?
Он сообщает вам относительный адрес из символа main
. Обратите внимание, что фактическое местоположение в памяти не назначается во время компиляции.
(Примечание редактора: это не исполняемый файл PIE, поэтому абсолютный адрес установлен во время соединения. Мы можем сказать,потому что адрес - 0x00400...
в младших 32 битах адресного пространства, а не 0x55555555....
)
Является ли значение рядом с регистром местом его памяти или значением, содержащимся в реестре?
Регистры не хранятся в памяти (кроме редких архитектур);регистры не имеют адресов и являются отдельным пространством от памяти. Также не отображается значение , на которое указывает регистр, который содержит действительный адрес.
Показанное значение является значением в самом резисторе. Обратите внимание, что rbx
и rcx
оба показывают 0x0
.
О чем говорит эта строка: начинается ли стек с адреса памяти 0x000000000040058c, и на что ссылаются main + 47?
(примечание редактора: эта часть неверна, но я не совсем уверен, что именно заменить ее чем-то другим. Но 0x40058c определенно не является приемлемым значением для RSP. main+47
кодовый адрес где-то внутри main
, как всегда для GDB symbol+number
).
Это расположение стека. Ваш код маленький, поэтому main
занимает всего 48 адресов. Обратите внимание, что память обычно выделяется в блоках, поэтому стек не будет отображаться в main+7
или в том, что сразу следует инструкции movl
.