web-dev-qa-db-fra.com

Que fait l'instruction LEAL Assembly?

Je suis un peu confus quant à la différence entre

leal -4(%ebp), %eax       

et 

movl -4(%ebp), %eax

Quelqu'un peut m'expliquer cela? 

16
Serguei Fedorov

LEA (adresse effective du chargement) calcule simplement le adresse de l'opérande, il ne le déréférence pas réellement. La plupart du temps, il se contente de faire un calcul similaire à une combinaison de multiplications et d'ajouts pour, par exemple, l'indexation de tableaux.

Dans ce cas, il effectue une simple soustraction numérique: leal -4(%ebp), %eax attribue simplement au registre %eax la valeur de %ebp - 4. Cela équivaut à une seule instruction sub, sauf qu'une sub requiert que la destination soit identique à l'une des sources.

L’instruction movl, en revanche, accède à l’emplacement de la mémoire situé à %ebp - 4 et la stocke dans %eax.

36
Adam Rosenfield

Si vous souhaitez examiner cela en termes de langage de programmation différent, alors:

int var;
[ ... ]
func (var, &var);

correspond au code d'assemblage suivant (Linux x86_64):

[...] 
 4: 8b 7c 24 0c mov 0xc (% rsp),% edi 
 8: 48 8d 74 24 0c lea 0xc (% rsp),% rsi 
 d: e8 xx xx xx xx xx callq ... <func> 
 [.]

Depuis %rdi/%rsi sont les 1st / 2dakota du Nord arguments, vous pouvez voir que lea ... récupère l'adresse adresse &var d'une variable, alors que mov ... charge/stocke la valeur var de la même chose.

C'est à dire. Dans Assembly, l'utilisation de lea au lieu de mov est similaire à l'utilisation de l'opérateur address-of & en C/C++, et non à la (valeur de) une variable elle-même.

lea a bien d'autres utilisations que cela, mais vous avez explicitement demandé quelle était la différence entre les deux.

Par exemple, mov avec un opérande de mémoire effectue toujours un accès à la mémoire (chargement ou stockage), tandis que l’opérande de mémoire de lea est simplement traité comme arithmétique de pointeur - c’est-à-dire que l’adresse est calculée et résolue mais aucun accès mémoire l'instruction elle-même. Ces deux:

lea 1234(%eax, %ebx, 8), %ecx
movl (%ecx), ecx

donner le même résultat que:

movl 1234(%eax, %ebx, 8), %ecx

tandis que les suivantes:

leal (%eax, %eax, 4), %eax

multiplie la valeur dans %eax par cinq.

5
FrankH.

Équivalent à LEA en syntaxe Intel, adresse effective de la charge (long?).

1
zxcdw

LEA et MOV peuvent tous deux charger un registre avec le décalage dans une variable Par exemple.

Le MOV peut également transférer le contenu d'un emplacement mémoire dans un registre, LEA Ne peut pas . Les deux LEA et MOV peuvent calculer des "décalages effectifs" pouvant être utilisés pour effectuer des calculs beaucoup plus efficaces

0
hell