2017-02-09 16 views
0

Мне не удалось найти документацию на выходе objdump. В objdump выход -D, я вижу ниже ASM, но я не понимаю: LEA 0x0 (% еси, 1),% есиAT & T x86 Assembly "lea 0x0 (% esi, 1),% esi"

Из https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax я могу видеть, что есть 4 параметра в «указатель»: сегмент: смещение (базовый регистр, регистр смещения, скалярный множитель)

Но что означает этот 0x0 (% esi, 1)? скаляр опущен как 0? Е-майл может быть решена, чтобы помочь мне настроить руководство по эксплуатации AT & T asm?

Спасибо, Стивен

+2

Ну, число вне скобки может быть только смещением. Внутри круглой скобки единственное, что может быть числом, - это масштаб. Итак ... :) Это просто objdump, педантичный. –

+0

Когда вы используете скалярное значение 1 (и смещение 0) с одним регистром, предполагается, что указанный регистр является базой. В действительности 'lea 0x0 (% esi, 1),% esi' - это то же самое, что и' lea (% esi),% esi'. Вы также можете получить 'objdump' для вывода инструкций с синтаксисом Intel, который может быть вам более знаком. Вы можете сделать это, добавив опцию '-Mintel' –

+2

Это 3-байтовый NOP, IIRC. – ninjalj

ответ

3

0x0 является смещение, и когда он равен нулю, то это означает, что он может быть опущен. 1 - это масштаб, а когда он равен 1, это означает, что его также можно опустить. Таким образом, эта инструкция lea 0x0(%esi,1),%esi такая же: lea esi,[esi*1+0x00] lea esi,[esi]

+0

Спасибо, S.MAHDI! Теперь я понимаю, что это то же самое, что «lea esi, [esi]». Итак, вы имеете в виду, что ** базовый регистр ** в этом случае опускается, не так ли? Еще один комментарий Маргарет и Майкл указал, что пропущенный, кажется, смещен? Кажется интересным в этом вопросе - разные люди имеют разное понимание, но, наконец, идут к одному и тому же результату. ;) –

+0

S.MAHDI и др., С вашей помощью, я оглянулся на страницу GAS_Syntax в своем вопросе и теперь имею более глубокое понимание. Он гласит: ** Любой или оба из числа и любой из параметров регистра могут быть опущены **. И пример без базы - это как ** leal 8 (,% eax, 4),% eax **. Однако для этого он должен быть ** смещением **, который опущен. Спасибо всем ~ –

+0

Приятно сердцу, что мой ответ помог вам. –