Что представляет собой функция 0x10 в отношении этой инструкции LEAL? Является ли это умножением или добавлением или что-то еще?
leal 0x10(%ebx), %eax
Кто-нибудь может прояснить? Это ассемблер x86 в ящике Linux.
Что представляет собой функция 0x10 в отношении этой инструкции LEAL? Является ли это умножением или добавлением или что-то еще?
leal 0x10(%ebx), %eax
Кто-нибудь может прояснить? Это ассемблер x86 в ящике Linux.
leal, или полное имя lea - "Загрузить эффективный адрес", и он делает именно это: он вычисляет адрес.
В вашем примере вычисление адресов очень просто, поскольку оно просто добавляет смещение к ebx и сохраняет результат в eax:
eax = ebx + 0x10
lea может сделать намного больше. Он может добавлять регистры, умножать регистры с константами 2, 4 и 8 для адресных вычислений слов, целых чисел и удвоений. Он также может добавить смещение.
Обратите внимание, что lea является особенным в том смысле, что он никогда не будет изменять флаги, даже если вы используете его как простое дополнение, как в приведенном выше примере. Компиляторы иногда используют эту функцию и заменяют добавление с помощью lea, чтобы помочь планировщику. Это не редкость видеть, что инструкции lea выполняют простую арифметику в скомпилированном коде по этой причине.
lea
означает "эффективный адрес нагрузки"; это способ использовать сложные методы адресации набора инструкций IA32 для выполнения арифметики. Суффикс l
- это способ различить размер операндов команд в синтаксисе GNU как, который у вас есть в вашем Linux-поле.
Итак, короче говоря, да, это своего рода инструкция по добавлению. Он также может обрабатывать умножения на 2, 4 или 8 в то же время.
См. также этот связанный вопрос (где они используют синтаксис Intel для обсуждения одной и той же инструкции):
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 Когда вы это увидите, станет ясно, почему некоторые части адреса могут быть опущены и что каждый форма будет скомпилирована.
Чтобы добавить к ответу 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
Надеюсь, что это поможет