web-dev-qa-db-fra.com

Que signifient les parenthèses dans x86 asm?

Étant donné le code suivant:

L1     db    "Word", 0

       mov   al, [L1]
       mov   eax, L1

Que représentent les crochets ([L1])?

55
joek1975

[L1] signifie le contenu de la mémoire à l'adresse L1. Après avoir exécuté mov al, [L1] ici, le registre al recevra l'octet à l'adresse L1 (la lettre 'w').

46
interjay

Opérandes de ce type, tels que [ebp], sont appelés opérandes mémoire .

Toutes les réponses ici sont bonnes, mais je vois que personne ne parle de la mise en garde en suivant cela comme une règle rigide - si crochets, alors déréférence, sauf quand c'est l'instruction lea.

lea est une exception à la règle ci-dessus. Disons que nous avons

mov eax, [ebp - 4]

La valeur de ebp est soustraite de 4 et les crochets indiquent que la valeur résultante est prise comme une adresse et que la valeur résidant à cette adresse est stockée dans eax. Cependant, dans le cas de lea, les crochets ne signifieraient pas que:

lea eax, [ebp - 4]

La valeur de ebp est soustraite de 4 et la valeur résultante est stockée dans eax. Cette instruction calcule simplement l'adresse et stocke la valeur calculée dans le registre de destination. Voir cet article pour plus de détails.

35
legends2k

Signifie simplement de récupérer la mémoire à l'adresse indiquée par l'étiquette L1.

Si vous aimez C, alors pensez-y comme ceci: [L1] est le même que *L1

30
Earlz

Les crochets signifient de dé-référencer une adresse. Par exemple

mov eax, [1234]

signifie déplacer le contenu de l'adresse 1234 vers EAX. Donc:

1234 00001

EAX contiendra 00001.

6
Jason Evans

Adressage direct en mémoire - al sera chargé avec la valeur située à l'adresse mémoire L1.

2
John Dibling

Ils signifient qu'au lieu de déplacer la valeur du registre ou la valeur numérique L1 dans le registre al, traitez la valeur du registre ou la valeur numérique L1 comme pointeur dans la mémoire, récupérez le contenu de cette adresse mémoire et déplacez ce contenu dans al.

Dans ce cas, L1 est un emplacement de mémoire, mais la même logique s'appliquerait si un nom de registre était entre crochets:

mov al, [ebx]

Également connu sous le nom de charge.

1
Alex Brown

Comme avec de nombreux langages d'assembleur, cela signifie l'indirection. En d'autres termes, le premier mov charge al avec le contents de L1 (l'octet 'w' en d'autres termes), pas l'adresse.

Votre deuxième mov charge en fait eax avec adresseL1 et vous pourrez ultérieurement déréférencer cela pour obtenir ou définir son contenu.

Dans ces deux cas, L1 est conceptuellement considéré comme l'adresse.

0
paxdiablo

Il indique que le registre doit être utilisé comme pointeur pour l'emplacement réel, au lieu d'agir sur le registre lui-même.

0