Подтвердить что ты не робот

Что такое 0x10 в инструкции по сборке "leal 0x10 (% ebx),% eax" x86?

Что представляет собой функция 0x10 в отношении этой инструкции LEAL? Является ли это умножением или добавлением или что-то еще?

leal 0x10(%ebx), %eax

Кто-нибудь может прояснить? Это ассемблер x86 в ящике Linux.

4b9b3361

Ответ 1

leal, или полное имя lea - "Загрузить эффективный адрес", и он делает именно это: он вычисляет адрес.

В вашем примере вычисление адресов очень просто, поскольку оно просто добавляет смещение к ebx и сохраняет результат в eax:

eax = ebx + 0x10

lea может сделать намного больше. Он может добавлять регистры, умножать регистры с константами 2, 4 и 8 для адресных вычислений слов, целых чисел и удвоений. Он также может добавить смещение.

Обратите внимание, что lea является особенным в том смысле, что он никогда не будет изменять флаги, даже если вы используете его как простое дополнение, как в приведенном выше примере. Компиляторы иногда используют эту функцию и заменяют добавление с помощью lea, чтобы помочь планировщику. Это не редкость видеть, что инструкции lea выполняют простую арифметику в скомпилированном коде по этой причине.

Ответ 2

lea означает "эффективный адрес нагрузки"; это способ использовать сложные методы адресации набора инструкций IA32 для выполнения арифметики. Суффикс l - это способ различить размер операндов команд в синтаксисе GNU как, который у вас есть в вашем Linux-поле.

Итак, короче говоря, да, это своего рода инструкция по добавлению. Он также может обрабатывать умножения на 2, 4 или 8 в то же время.

См. также этот связанный вопрос (где они используют синтаксис Intel для обсуждения одной и той же инструкции):

Ответ 3

GNU as 2.18 docs

https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html

AT & T: -4 (% ebp), Intel: [ebp - 4]

а затем синтаксис Intel является самоочевидным.

Что еще более важно, документы также объясняют общий случай:

Ссылка на косвенную память синтаксиса Intel формы

 section:[base + index*scale + disp]

преобразуется в синтаксис AT & T

 section:disp(base, index, scale)

где база и индекс являются необязательными 32-разрядными базовыми и индексными регистрами, disp - это необязательное смещение, а масштаб, принимающий значения 1, 2, 4 и 8, умножает индекс для вычисления адреса операнда

В AT & T все становится немного грязным, когда мы опускаем некоторые части адреса, например. -4(%ebp), но с примерами в документах мы можем легко вывести все случаи синтаксиса.

Чтобы понять, что происходит, я рекомендую вам взглянуть на то, как кодируются инструкции. Это хороший учебник: http://www.c-jump.com/CIS77/CPU/x86/lecture.html Когда вы это увидите, станет ясно, почему некоторые части адреса могут быть опущены и что каждый форма будет скомпилирована.

Ответ 4

Чтобы добавить к ответу Nils,

Как обновитель, режим добавления в ассемблере IA32 обычно имеет вид:

IO (Rb, Ri, s), где:

IO = немедленное смещение

Rb = базовый регистр

Ri = индексный регистр

s = коэффициент масштабирования {1, 2, 4, 8}

Таким образом, эффективный адрес вычисляется как * IO + [Eb] + [Ei] s

leal похож на другие команды, такие как movl, но это немного особенное. Вместо того, чтобы читать от источника до места назначения, он копирует эффективные адрес источника в пункт назначения.

Таким образом, он может использоваться для создания указателей для последующих ссылок на память, а также для основных арифметических операций, как указал Нильс.

Например:

пусть register% edx содержит значение x

leal 1 (% edx,% edx, 8),% eax

загрузит эффективный адрес 1 + x + 8 * x = 1 + 9x для регистрации% eax.

В сущности, операция:

leal источник, destination = > destination = адрес источника

Если вы знакомы с C, это эквивалент:

char * b = & a;

где адресу char a присваивается указатель char b

еще примеры:

Пусть зарегистрировано значение% eax hold x и зарегистрировано значение% ecx hold y

leal (% eax,% ecx, 4),% edx назначит значение x + 4y для регистрации% edx

leal 0xB (,% ecx, 5),% edx назначит значение 0xB + 5y = 11 + 5y to% edx

leal (% eax,% eax, 2),% eax назначит значение 3x для регистрации% eax

Надеюсь, что это поможет