これらの指示の違いは何ですか?
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
バージョンは、table_addr
がローカル変数である場合でも正常に機能します。
some_procedure proc
local table_addr[64]:Word
lea ax,table_addr
基本的には... "REGに移動します...計算した後..."他の目的でも同様です:)
値がポインタであることを忘れた場合、コードの最適化/最小化に使用できます...
MOV EBX , 1
MOV ECX , 2
;//with 1 instruction you got result of 2 registers in 3rd one ...
LEA EAX , [EBX+ECX+5]
EAX = 8
もともとそれは次のようになります:
MOV EAX, EBX
ADD EAX, ECX
ADD EAX, 5