ar db "Defference $"
違いは何ですか
mov dx,offset ar
と
lea dx,ar
どちらも同じ仕事をしていると思いますが、これら2つの違いは何ですか
このユースケースでは、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]
は、算術命令とは見なされないため、フラグを変更しません。
これは、いくつかの単純な計算 (アドレス計算は非常に一般的です) を行う際にフラグを保持したい場合に役立ちます。フラグ レジスタの保存と復元は実行可能ですが、処理が遅くなります。
x86 プロセッサ用のアセンブリ言語、7e、KIP R. IRVINE からの引用
OFFSET はコンパイル時に既知のアドレスでのみ機能するため、OFFSET を使用してスタック パラメーターのアドレスを取得することはできません。次のステートメントはアセンブルされません。
mov esi,OFFSET [ebp-30] ; error