Qu'est-ce que le 0x10 dans l'instruction d'assemblage "leal 0x10(%ebx), %eax" x86?

Quelle est la fonction du 0x10 par rapport à cette instruction LEAL? Est-ce une multiplication ou une addition ou autre chose?

leal 0x10(%ebx), %eax

quelqu'un peut-il clarifier? C'est un assembleur x86 sur une machine Linux.

32

4 réponses

leal, ou nom complet lea est "Load effective address" et il fait exactement cela: il fait un calcul d'adresse.

dans votre exemple, le calcul de l'adresse est très simple, car il ajoute juste un décalage à ebx et stocke le résultat dans eax:

eax = ebx + 0x10

lea peut faire beaucoup plus. Il peut ajouter des registres, multiplier des registres avec les constantes 2, 4 et 8 pour les calculs d'adresse des mots, des entiers et des doubles. Il pouvez également ajouter un offset.

notez que lea est spécial du fait qu'il ne modifiera jamais les drapeaux, même si vous l'utilisez comme simple ajout comme dans l'exemple ci-dessus. Les compilateurs exploitent parfois cette fonctionnalité et remplacent un ajout par une lea pour aider l'ordonnanceur. Il n'est pas rare de voir Lea instructions faire arithmétique simple dans le code compilé pour cette raison.

71
répondu Nils Pipenbrinck 2010-10-23 12:21:52

lea signifie "load effective address"; c'est une façon d'utiliser les modes d'adressage sophistiqués de L'instruction IA32 réglée pour faire de l'arithmétique. Le suffixe l est un moyen de distinguer la taille des opérandes d'instruction dans la syntaxe de GNU as, que vous avez sur votre machine Linux.

donc, en résumé, Oui, c'est une sorte d'instruction complémentaire. Il peut également gérer les multiplications par 2, 4 ou 8 en même temps.

voir aussi cette question relative à la (où ils sont à l'aide de la syntaxe Intel pour discuter de la même instruction):

4
répondu Pascal Cuoq 2017-05-23 12:16:51

GNU as 2.18 docs

https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html

AT& T: -4 (%ebp), Intel: [ebp - 4]

et puis la syntaxe Intel est explicite.

plus important encore, les docs expliquent aussi le cas général:

une syntaxe Intel indirecte référence de mémoire du formulaire

 section:[base + index*scale + disp]

est traduit dans la syntaxe AT&T

 section:disp(base, index, scale)

où base et index sont les registres optionnels 32 bits base et index, disp est le déplacement optionnel, et scale, en prenant les valeurs 1, 2, 4, et 8, multiplies index pour calculer l'adresse de l'opérande

les choses se gâtent un peu dans AT & T lorsque nous omettons certaines parties de l'adresse, par exemple -4(%ebp) , mais avec les exemples dans les documents nous pouvons facilement déduire tous les cas de syntaxe.

pour bien comprendre ce qui se passe, je vous recommande de regarder comment les instructions sont encodées. C'est un bon tutoriel: http://www.c-jump.com/CIS77/CPU/x86/lecture.html lorsque vous voyez cela, il devient clair pourquoi certaines parties de l'adresse peuvent être omises, et ce que chaque formulaire compilera.

2

pour ajouter à la réponse de Nils,

comme rafraîchisseur, le mode d'adressage dans l'assembleur IA32 est généralement de la forme:

IO (Rb, Ri, s), où:

IO = Décalage Immédiat

Rb = Registre De Base

Ri = Indice De Registre

s = facteur D'échelle{1, 2, 4, 8}

ainsi l'adresse effective est calculée comme * IO + [Eb] + [Ei] s

leal ressemble à d'autres instructions comme movl, mais il est un peu spécial. Au lieu de lire de la source à la destination, il copie l'efficace adresse de la source à la destination.

de sorte qu'il peut être utilisé pour générer des pointeurs pour des références de mémoire plus tard, et aussi pour les opérations arithmétiques de base, comme Nils souligné.

par exemple:

laissez registre %edx contenir une valeur de x

leal 1 (%edx, % edx, 8), %eax

chargera l'adresse effective de 1 + x + 8*x = 1 + 9x pour enregistrer %eax.

en substance, l'opération:

leal source , destination = > destination = adresse de source

si vous connaissez C, c'est l'équivalent de:

char * b = &a;

où l'adresse de la case a est attribuée à l'indicateur de la case B

autres exemples:

Laissez registre %eax tenir la valeur de x, et le registre %ecx tenir la valeur de y

leal (%eax, %ecx, 4), %edx assignera la valeur x + 4y pour enregistrer % edx

leal 0xB (, % ecx, 5), %edx assignera la valeur 0xB + 5y = 11 + 5y à %edx

leal (%eax, %eax,2), %eax affectez la valeur 3x registre %eax

Espérons que cette aide

0
répondu Kelvin Spencer 2015-09-05 13:41:38