Я новичок в GDB и имею некоторые проблемы с этим. У меня есть x86 proccesor, и это означает, что регистр eip в моем proccesor должен содержать 4 байта памяти. Я скомпилировал некоторый c-код и установил точку останова на main(). Ввод x/x $ eip возвращает мне «0xd02404c7» (шестнадцатеричный), который, как я знаю, является инструкцией для машинного языка. Поэтому мои вопросы: если эта машинная инструкция имеет размер 4 байта. Эта команда «х/4x $ EIP» должен отображать 16 байт, и показать мне это:Рассмотрение памяти с помощью x86 proccesor
0x8048426 <main+9>: 0xd02404c7 0xe8080484 0xfffffebe 0x9066c3c9
Так я запутался. Если это 16 байт, то почему он показывает мне, что он находится в той же памяти, когда 1 регистр в 32-разрядном proccesor должен содержать только 4 байта? Спасибо.
Коды операций x86 не всегда равны четырем байтам (инфакт очень редко составляет четыре байта). 'eip' не сохраняет текущую инструкцию, он сохраняет * адрес * текущей инструкции. – slugonamission
так в основном "0xd02404c7 0xe8080484 0xfffffebe 0x9066c3c9" это адреса поисков правильно? Я смущен, не означает ли это, что когда proccesor является x86, его регистры имеют максимальную память 4 байт? –
Регистры - это максимум четыре байта, да, но '$ eip' хранит * адрес * следующей инструкции, а не следующую следующую инструкцию. То, что вы видите на своем выходе, - это адрес инструкции (слева), затем четыре слова инструкции. Подумайте об использовании 'дизассемблировать $ eip' вместо этого, чтобы показать код операции. – slugonamission