wake-up-neo.com

Was ist der Unterschied zwischen MOV und LEA?

Ich würde gerne wissen, was der Unterschied zwischen diesen Anweisungen ist:

MOV AX, [TABLE-ADDR]

und

LEA AX, [TABLE-ADDR]
108
naveen
  • LEA bedeutet "Effektive Adresse laden"
  • MOV bedeutet Ladewert

Kurz gesagt, LEA lädt einen Zeiger auf das Objekt, das Sie ansprechen, während MOV den tatsächlichen Wert an dieser Adresse lädt.

Der Zweck von LEA besteht darin, eine nicht triviale Adressberechnung durchzuführen und das Ergebnis zu speichern [für die spätere Verwendung].

LEA ax, [BP+SI+5] ; Compute address of value

MOV ax, [BP+SI+5] ; Load value at that address

Wenn es sich nur um Konstanten handelt, kann es vorkommen, dass sich MOV (durch die konstanten Berechnungen des Assemblers) mit den einfachsten Anwendungsfällen von LEA überschneidet. Dies ist nützlich, wenn Sie eine mehrteilige Berechnung mit mehreren Basisadressen usw. haben.

133
Ruben Bartelink

In der NASM-Syntax:

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

Verwenden Sie in der MASM-Syntax OFFSET var um ein mov-instant anstelle eines load zu bekommen.

41

Der Befehl MOV reg, addr bedeutet, dass eine an der Adresse addr gespeicherte Variable in das Register reg gelesen wird. Der Befehl LEA reg, addr bedeutet, dass die Adresse (nicht die an der Adresse gespeicherte Variable) in das Register reg gelesen wird.

Eine andere Form des MOV-Befehls ist MOV reg, immdata, was bedeutet, dass die immdata der Sofortdaten (d. H. Konstanten) in das Register reg eingelesen werden. Es ist zu beachten, dass, wenn addr in LEA reg, addr nur eine Konstante ist (d. H. Ein fester Versatz), dieser LEA-Befehl im Wesentlichen genau dem äquivalenten Befehl MOV reg, immdata entspricht, der dieselbe Konstante wie unmittelbare Daten lädt.

24
Bill Forster

Wenn Sie nur ein Literal angeben, gibt es keinen Unterschied. LEA hat jedoch mehr Fähigkeiten, und Sie können hier darüber lesen:

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

10
Lars D

Es kommt auf den verwendeten Assembler an, denn

mov ax,table_addr

in MASM arbeitet als

mov ax,Word ptr[table_addr]

So lädt es die ersten Bytes von table_addr und NICHT der Offset zu table_addr. Sie sollten stattdessen verwenden

mov ax,offset table_addr

oder

lea ax,table_addr

was genauso funktioniert.

lea Version funktioniert auch, wenn table_addr ist eine lokale Variable, z.B.

some_procedure proc

local table_addr[64]:Word

lea ax,table_addr
10
Bartosz Wójcik

Grundsätzlich ... "Move into REG ... nachdem es berechnet wurde ..." scheint es auch für andere Zwecke gut zu sein :)

wenn Sie nur vergessen, dass der Wert ein Zeiger ist, können Sie ihn für Codeoptimierungen/-minimierungen verwenden.

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

ursprünglich wäre es:

MOV EAX, EBX
ADD EAX, ECX
ADD EAX, 5
2
Ostap