18
ar db "Defference $"

違いは何ですか

mov dx,offset ar

lea dx,ar

どちらも同じ仕事をしていると思いますが、これら2つの違いは何ですか

4

3 に答える 3

24

このユースケースでは、LEA と MOV は同じことを行います。より複雑な方法で住所を計算する場合、LEA は MOV よりも強力です。

たとえば、配列の n 番目の文字のアドレスを取得したいとします。n は bx に格納されています。MOV では、次の 2 つの命令を記述する必要があります。

Mov dx, offset ar
add dx, bx

lea を使用すると、たった 1 つの命令でそれを行うことができます。

lea dx, [ar + bx]

ここで考慮すべきもう 1 つの点は、add dx,bx命令が CPU のステータス フラグを変更することです。一方、命令内で行われる加算lea dx, [ar + bx]は、算術命令とは見なされないため、フラグを変更しません。

これは、いくつかの単純な計算 (アドレス計算は非常に一般的です) を行う際にフラグを保持したい場合に役立ちます。フラグ レジスタの保存と復元は実行可能ですが、処理が遅くなります。

于 2010-05-09T11:21:45.320 に答える
2

x86 プロセッサ用のアセンブリ言語、7e、KIP R. IRVINE からの引用

OFFSET はコンパイル時に既知のアドレスでのみ機能するため、OFFSET を使用してスタック パラメーターのアドレスを取得することはできません。次のステートメントはアセンブルされません。

mov esi,OFFSET [ebp-30]        ; error
于 2016-06-04T15:19:14.670 に答える