これらの指示の違いを知りたい:
MOV AX, [TABLE-ADDR]
と
LEA AX, [TABLE-ADDR]
LEA
ロード実効アドレスを意味しますMOV
負荷値を意味しますつまり、LEA
アドレス指定しているアイテムへのポインターをロードしますが、MOV はそのアドレスに実際の値をロードします。
の目的は、LEA
自明でないアドレス計算を実行し、結果を [後で使用するために] 保存できるようにすることです。
LEA ax, [BP+SI+5] ; Compute address of value
MOV ax, [BP+SI+5] ; Load value at that address
定数のみが含まれる場合、MOV
(アセンブラの定数計算によって) の使用の最も単純なケースと重複するように見えることがありますLEA
。複数のベースアドレスなどを含むマルチパート計算がある場合に役立ちます。
NASM 構文:
mov eax, var == lea eax, [var] ; i.e. mov r32, imm32
lea eax, [var+16] == mov eax, var+16
lea eax, [eax*4] == shl eax, 2 ; but without setting flags
MASM 構文でOFFSET var
は、ロードの代わりに mov-immediate を取得するために使用します。
命令 MOV reg,addr は、アドレス addr に格納されている変数をレジスタ reg に読み込むことを意味します。命令 LEA reg,addr は、アドレス (アドレスに格納されている変数ではない) をレジスタ reg に読み込むことを意味します。
MOV 命令のもう 1 つの形式は、MOV reg,immdata です。これは、即値データ (つまり、定数) immdata をレジスタ reg に読み込むことを意味します。LEA reg,addr の addr が単なる定数 (つまり、固定オフセット) である場合、その LEA 命令は、同じ定数を即値データとしてロードする同等の MOV reg,immdata 命令と本質的にまったく同じであることに注意してください。
リテラルのみを指定する場合、違いはありません。ただし、LEAにはさらに多くの機能があり、それらについてはここで読むことができます:
http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136
使用するアセンブラに依存します。
mov ax,table_addr
MASMでは次のように機能します
mov ax,word ptr[table_addr]
したがってtable_addr
、オフセットではなく、からの最初のバイトをロードしますtable_addr
。代わりに使用する必要があります
mov ax,offset table_addr
また
lea ax,table_addr
これは同じように機能します。
lea
versiontable_addr
がローカル変数の場合も正常に動作します。
some_procedure proc
local table_addr[64]:word
lea ax,table_addr
MOV は LEA [ラベル] と同じことを行うことができますが、MOV 命令には命令自体の内部に実効アドレスが即値定数として含まれています (アセンブラーによって事前に計算されます)。LEA は、PC 相対を使用して、命令の実行中に実効アドレスを計算します。
LEA (LoadEffective Address) は、シフトアンド加算命令です。8086 に追加されたのは、アドレス指定モードをデコードして計算するためのハードウェアがあるためです。
違いは微妙ですが重要です。MOV 命令は、事実上、TABLE-ADDR ラベルが表すアドレスのコピーである「MOVe」です。LEA 命令は、間接命令である「ロード有効アドレス」です。つまり、TABLE-ADDR は、ロードするアドレスが見つかったメモリ位置を指します。
LEA を効果的に使用することは、C などの言語でポインターを使用することと同等であり、強力な命令です。