web-dev-qa-db-ja.com

MOVとLEAの違いは何ですか?

これらの指示の違いは何ですか?

MOV AX, [TABLE-ADDR]

そして

LEA AX, [TABLE-ADDR]
108
naveen
  • 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の使用の最も単純な場合と重なるように見えることがあります。複数のベースアドレスなどのマルチパート計算がある場合に便利です。

133
Ruben Bartelink

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を取得します。

41

命令MOV reg、addrは、アドレスaddrに格納されている変数をレジスタregに読み込むことを意味します。命令LEA reg、addrは、アドレス(アドレスに格納されている変数ではない)をレジスタregに読み込むことを意味します。

MOV命令のもう1つの形式はMOV reg、immdataです。これは、即値データ(つまり定数)immdataをレジスタregに読み込むことを意味します。 LEA reg、addrのaddrが単なる定数(つまり、固定オフセット)である場合、そのLEA命令は、即値データと同じ定数をロードする同等のMOV reg、immdata命令と本質的にまったく同じであることに注意してください。

24
Bill Forster

リテラルのみを指定する場合、違いはありません。ただし、LEAにはさらに多くの機能があり、それらについてはこちらで読むことができます。

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136

10
Lars D

使用されるアセンブラに依存します。なぜなら

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
10
Bartosz Wójcik

基本的には... "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
2
Ostap