2015-04-11 2 views
0

Я новичок в 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 байта? Спасибо.

+0

Коды операций x86 не всегда равны четырем байтам (инфакт очень редко составляет четыре байта). 'eip' не сохраняет текущую инструкцию, он сохраняет * адрес * текущей инструкции. – slugonamission

+0

так в основном "0xd02404c7 0xe8080484 0xfffffebe 0x9066c3c9" это адреса поисков правильно? Я смущен, не означает ли это, что когда proccesor является x86, его регистры имеют максимальную память 4 байт? –

+0

Регистры - это максимум четыре байта, да, но '$ eip' хранит * адрес * следующей инструкции, а не следующую следующую инструкцию. То, что вы видите на своем выходе, - это адрес инструкции (слева), затем четыре слова инструкции. Подумайте об использовании 'дизассемблировать $ eip' вместо этого, чтобы показать код операции. – slugonamission

ответ

2

Ввод x/x $ eip возвращает мне «0xd02404c7» (шестнадцатеричный), который, как я знаю, является инструкцией для машинного языка.

Нет, это дает вам необработанных байт в вашем коде. Эти необработанные байты могут «покрывать» менее одной, одной или нескольких машинных инструкций. Самая короткая инструкция x86 занимает всего один байт. Самая длинная инструкция takes 15 bytes.

Так что мои вопросы: если эта машинная инструкция имеет размер 4 байт.

Адрес 4 байта, но сама инструкция может содержать от 1 до 15 байт. Вы можете видеть взаимосвязь между байтами и инструкциями, если вы делаете (gdb) disas/r main

Таким образом, каждый адрес памяти может хранить 4 машинных инструкции?

Совсем нет. Каждый адрес памяти соответствует 1 байту памяти. Этот байт может содержать целую (однобайтовую) инструкцию или может быть началом многобайтовой команды или вообще не содержать каких-либо инструкций (если адрес указывает, например, на номер .data).

Смежные вопросы