Quelle est la différence entre MOV et LEA?

Je voudrais savoir quelle est la différence entre ces instructions:

MOV AX, [TABLE-ADDR]

Et

LEA AX, [TABLE-ADDR]
93
demandé sur Michael Petch 2009-11-09 11:32:07

7 réponses

  • LEA signifie Charger L'adresse Effective
  • MOV signifie la valeur de charge

En bref, LEA charge un pointeur sur l'élément que vous adressez alors que MOV charge la valeur réelle à cette adresse.

Le but de LEA est de permettre d'effectuer une non-trivial adresse de calcul et de stocker le résultat [pour utilisation ultérieure]

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

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

Lorsqu'il n'y a que des constantes impliquées, MOV (à travers les calculs constants de l'assembleur) peut parfois sembler se chevaucher avec les cas les plus simples d'utilisation de LEA. C'est utile si vous avez un calcul en plusieurs parties avec plusieurs adresses de base, etc.

117
répondu Ruben Bartelink 2018-04-16 02:40:57

Dans la syntaxe 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

Dans la syntaxe MASM, utilisez OFFSET var pour obtenir un MOV-immediate au lieu d'une charge.

37
répondu Amit Singh Tomar 2018-04-16 02:50:57

L'instruction MOV reg, addr signifie lire une variable stockée à l'adresse addr dans le registre reg. L'instruction Lea reg, addr signifie lire l'adresse (pas la variable stockée à l'adresse) dans le registre reg.

Une autre forme de l'instruction MOV est MOV reg, immdata qui signifie lire les données immédiates (c'est-à-dire constantes) immdata dans le registre reg. Notez que si l'addr dans Lea reg, addr est juste une constante (c'est-à-dire un décalage fixe) alors cette instruction LEA est essentiellement la même que une instruction MOV Reg,immdata équivalente qui charge la même constante que les données immédiates.

21
répondu Bill Forster 2009-11-09 10:28:28

Si vous spécifiez seulement un littéral, il n'y a pas de différence. LEA a plus de capacités, cependant, et vous pouvez lire à leur sujet ici:

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

10
répondu Lars D 2015-09-13 16:41:21

Cela dépend de l'assembleur utilisé, car

mov ax,table_addr

Dans MASM fonctionne comme

mov ax,word ptr[table_addr]

Donc, il charge les premiers octets de table_addr et non le décalage vers table_addr. Vous devriez utiliser à la place

mov ax,offset table_addr

Ou

lea ax,table_addr

Qui fonctionne de la même manière.

lea version fonctionne aussi très bien si table_addr est une variable locale par exemple

some_procedure proc

local table_addr[64]:word

lea ax,table_addr
10
répondu Bartosz Wójcik 2017-08-16 13:02:54

En Gros ... "Emménagez dans REG ... après calcul il..." il semble être agréable à d'autres fins aussi:)

Si vous oubliez simplement que la valeur est un pointeur vous pouvez l'utiliser pour les optimisations/minimisation de code ...ce que jamais..

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

À L'origine, ce serait:

MOV EAX, EBX
ADD EAX, ECX
ADD EAX, 5
2
répondu Ostap 2017-10-19 22:15:05

La différence est subtile, mais importante. L'instruction MOV est un' MOVe ' effectivement une copie de l'adresse que L'étiquette TABLE-ADDR représente. L'instruction LEA est une 'Load Effective Address' qui est une instruction indirecte, ce qui signifie que TABLE-ADDR pointe vers un emplacement de mémoire où l'adresse à charger est trouvée.

L'utilisation efficace de LEA équivaut à l'utilisation de pointeurs dans des langages tels que C, en tant que tel, c'est une instruction puissante.

-1
répondu Guillermo Phillips 2009-11-09 08:46:29