Считывание более 4 байт из 4-байтового регистра с помощью GDB

#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 .