2010-12-16 20 views
3

私は自分の時間にアセンブリ言語を学ぶ大学生です。私はaddやmulのような命令があるが、算術演算子はしばしば命令の中で使われることに気付いた。たとえば:アセンブリ言語:+ vs add

mov eax,[ebx+ecx] 

は、それは次のように同等ですか?

add ebx,ecx mov eax,[ebx] 

答えて

1

メモリから何かを読み取る限り、機能的には同じです。すでに述べた相違点は、レジスタオフセットアドレッシング[ebx + ecx]に対して厳密に使用され、ebxを変更してベースアドレスを破棄する場合、フラグを変更しないことです。また、2倍の命令、2倍のフェッチを消費します。 x86は可変命令長であるため、必ずしも命令の2倍のバイト数を意味するわけではありませんが、同じタスクを実行するためにより多くのクロックサイクルと多くのキャッシュスペースが必要になります。

あなた自身の時間にアセンブリを勉強し続けたいと思います。他の命令セット(ARM、サム、mips、msp430、avrなど)も勉強することをおすすめします。これらのトレードオフをよく見ることがあります。レジスタを破棄したり、フラグを変更したりせずに、そのような追加を行う場合があります。場合によっては、レジスタを消費する必要がなく、すべてのループ上のすべての参照に余分な命令を追加するなど、コードをより速くまたはきれいにするために、レジスタオフセットアドレッシングが必要な場合があります。多くのプロセッサーにレジスター・オフセット・アドレッシングがあることを知っていると、例えば、ジェネリックとターゲット固有の両方のパフォーマンスに関心がある場合、これらの機能を利用するための高水準コードを書くことができます。

2

いいえ、それは等価ではない(EBXの内容の変化を無視して)。これが実際のコードであれば、角括弧の中にあるものはaddressing modeの例です。アドレッシングモードは、演算の実効アドレスがどのように計算されるかを制御しますが、通常、永続的な効果はありません。 2番目のコードスニペットは実際にはebxレジスタに追加され、その内容は次の手順で変更されます。

更新:私はあなたの最後の文章で変更を無視することを見ました...あなたがそれを無視したいなら、はい、私は2つのスニペットが同等であると信じています。

3

ほぼ... このインデックスアドレス方式([ebx + ecx]またはその他)は、通常、一部の配列またはレコードの要素のアドレス指定に使用されます。あなたのケースではebxはバイト配列へのポインタとなり、ecxはインデックスです。インデックスのアドレッシングを使用すると危険です。算術演算後にフラグが設定されていないため、配列の範囲のオーバーフローをチェックできません。通常、デバッグモードの高レベルコンパイラは、より遅いメソッドを使用しているため、配列の範囲のオーバーフローを検出できます。コンパイラをrelaseモードに切り替えると(バグがなくなると確信しています)、より高速なインデックス・アドレッシング方法が使用されています。