#assembly #x86 #gdb #cpu-registers
#сборка #x86 #gdb #cpu-регистры
Вопрос:
У меня вопрос понимания. Например, 32-разрядный чип x86 имеет длину регистра 4 байта. Отлично. С помощью gdb я могу указать чтение 4 байт из целевого регистра. ( x/4b $edx
).
Но если я введу x/40b
, что означает «дайте мне 40 байт из 4-байтового регистра». Это меня сильно смущает. Как это возможно?
Все ли после четвертого байта «мусор», или это из другой области памяти / регистра?
Ответ №1:
x
считывает память, а не регистры.
Он получает адрес из используемого вами выражения (которое, оказывается, включает значение регистра) и увеличивает его, чтобы прочитать столько байт из памяти, сколько вы запросили.
Ни один из этих байтов не является значением регистра. Значение регистра отображается только в столбце адреса x
выходных данных. (И то только в том случае, если вы случайно использовали выражение, которое представляло собой один регистр, а не $eax $edi
, $edi 16
или (char*)symbol 12
)
Если вам нужно значение регистра, используйте p /x $eax
, или info reg
, или layout reg
.