В чем разница между "lea eax, [ebx + eax]" и "add eax, ebx" в сборке x86-32? - PullRequest
4 голосов
/ 30 ноября 2010

GCC сделал мне какой-то ассемблерный код, а внутри есть это утверждение:

lea eax, [ebx+eax]

(Синтаксис Intel) Просто любопытно, какая разница между этим и:

add eax, ebx

Be

eax, а ebx содержит возвращаемые значения из функций:)

mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax 
call CALC1
mov ebx, eax.
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call CALC2
lea eax, [ebx+eax]

Ответы [ 3 ]

11 голосов
/ 30 ноября 2010

Одно отличие, которое сразу приходит на ум, заключается в том, что lea не влияет на флаги, тогда как add влияет.

Невозможно сказать, не увидев остальную часть кода сборки, имеет ли это какое-либо значение. Это может быть просто артефакт генератора кода GCC (то есть фактически он может создавать код для более общего случая или просто использовать lea как более гибкий add.)

6 голосов
/ 30 ноября 2010

Вы можете поместить результат в регистр, отличный от EAX, например lea edx, eax + ebx.add не может этого сделать.

lea также может иметь дополнительный третий операнд, например lea eax, ebp + esi + 12, что делает его более удобной альтернативой инструкции add.

Вы также можете комбинировать определенное (размерное слово) умножениеоперации с ним, такие как lea eax, ebp + eax * 8.

Не говоря уже о том, что он лучше описывает цель :)

4 голосов
/ 30 ноября 2010

С точки зрения числового результата разницы нет.

Однако в инструкции есть нечто большее, чем фактический результат, который хранится в регистре назначения:

  1. Как указано aix , lea не устанавливает флаги в зависимости от результата сложения. Это иногда полезно для целей планирования команд.

  2. Есть также временные различия на некоторых микроархитектурах (ранние ядра Atom); в частности, в результатах пересылки результатов между арифметическими модулями и модулями генерации адресов присутствуют киоски, и использование add или lea в зависимости от контекста может устранить эти (очень маленькие) киоски.

...