2010-11-30 10 views
3

GCCは私のいくつかのアセンブリコード作られ、そして内部のこの文をtheresの:x86-32アセンブリの "lea eax、[ebx + eax]"と "add eax、ebx"の違いは何ですか?

lea eax, [ebx+eax] 

(インテル構文) 興味があるだけ、どのようなもの、との違いになります。

add eax, ebx 

ては?すぐに頭にスプリング

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] 
+1

の可能性のある重複した[LEAまたは命令を追加しますか?](http://stackoverflow.com/questions/6323027/lea-or-add-instruction) –

答えて

6

EAX以外のレジスタに結果を入れることができますたとえば、lea edx, eax + ebxなどです。 addできません。

leaにはlea eax, ebp + esi + 12などの追加の第3オペランドを追加することができ、add命令の手軽な代替方法にすることができます。

のような特定の(ワードサイズの)乗算演算を組み合わせることもできます。それは数値結果の面でより良い意思:)

11

1つの違いはaddが行うのに対しleaは、フラグに影響を与えないことです。

アセンブリコードの残りの部分を見ることなく、これが関連性があるかどうかはわかりません。 GCCのコードジェネレータの人為的なものである可能性があります(実際には、より一般的なケースのコードを生成している可能性があります。add

+0

1 LEAがフラグに影響を与えていないことを指摘しました。 – Sparky

4

を記述していることは言うまでもありません

、違いはありません。

しかしながら、デスティネーションレジスタに格納される実際の結果より命令に複数存在する:

  1. としてAIXは結果に基づいて、フラグを設定しないlea、指摘しました添加。これは、命令スケジューリングの目的で便利なことがあります。

  2. いくつかのマイクロアーキテクチャ(初期のAtomコア)にはタイミングの違いもあります。具体的には、演算ユニットとアドレス生成ユニットの間で結果を転送するためのストールがあり、文脈によってはaddまたはleaのいずれかを使用すると、これらの(非常に小さい)ストールを排除できます。

+0

古いIntelプロセッサの中には、leaがaddよりもかなり遅いものがあります。現在の作物についてはわかりませんが、おそらくそれはおそらくもう起こっていないと思われます。 –

+0

True; AMDのAthlon以降では、有益かもしれません。実際には、「LEA」はALUではなくアドレス指定エンジンによって処理されるため、別の並列演算を実行する方法です。 –

+1

@Brian:はい、どちらも、私が知っている現在のすべてのIntelプロセッサでシングルサイクル動作です(一部のプロセッサでは、* more * 'add'命令を一度に発行することは可能です)。 –

関連する問題