Étant donné le code suivant:
L1 db "Word", 0
mov al, [L1]
mov eax, L1
Que représentent les crochets ([L1])?
[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').
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.
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
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.
Adressage direct en mémoire - al
sera chargé avec la valeur située à l'adresse mémoire L1
.
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.
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.
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.