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]
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.
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.
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.
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
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
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
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.