Vu le code suivant:Que signifient les parenthèses dans x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
Que signifient les crochets ([L1]) représentent?
Vu le code suivant:Que signifient les parenthèses dans x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
Que signifient les crochets ([L1]) représentent?
[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').
Les parenthèses signifient de dé-référencer une adresse. Par exemple
mov eax, [1234]
moyens, mov le contenu de l'adresse 1234 à EAX. Alors:
1234 00001
EAX contiendra 00001.
Comme beaucoup de langues assembleur, cela signifie indirection. En d'autres termes, le premier mov
charge al
avec le contenu de L1
(l'octet 'w'
en d'autres termes), pas l'adresse.
Votre deuxième mov
charge en fait eax
avec l'adresseL1
et vous pouvez ensuite déréférencer que pour obtenir ou définir son contenu.
Dans ces deux cas, L1
est conceptuellement considérée comme l'adresse.
Ils signifient qu'au lieu de déplacer la valeur de la valeur registre ou numérique L1
dans le registre al
, traiter la valeur du registre ou une valeur numérique L1
comme pointeur dans la mémoire, récupérer le contenu de cette adresse mémoire, et propose que le contenu en al
.
Dans ce cas, L1 est un emplacement de mémoire, mais la même logique s'appliquerait si un nom de registre était dans les crochets:
mov al, [ebx]
connu également comme charge.
Il indique que le registre doit être utilisé comme un pointeur pour l'emplacement réel, au lieu d'agir sur le registre lui-même.
Direct memory addressing - al
sera chargé avec la valeur située à l'adresse de mémoire L1
.
Signifie simplement d'obtenir la mémoire à l'adresse marquée par l'étiquette L1.
Si vous aimez C, alors pensez comme ceci: [L1]
est le même que *L1
cela peut être déroutant car dans C '* p' signifie que _dereference p et arrêter de récupérer des caractères lorsque vous atteignez' \ 0'_ et pas seulement _déréférence le premier caractère de la séquence/chaîne pointée par p_ – user2485710
@ user2485710 Non, 'p 'signifie déréférencer le caractère pointé par' p'. Les cordes n'ont rien à voir avec ça. – Navin
Opérandes de ce type, tels que [ebp]
, sont appelés memory operands.
Toutes les réponses ici sont bonnes, mais je vois que personne ne parle de la mise en garde à la suite de cette règle rigide comme - si entre parenthèses, puis déréférencer, sauf quand il est l'instruction lea
.
lea
est une exception à la règle ci-dessus. Dire que nous avons
mov eax, [ebp - 4]
La valeur de ebp
est soustraite par 4 et les crochets indiquent que la valeur résultante est prise comme une adresse et la valeur résidant à cette adresse est stockée dans eax
. Cependant, dans le cas de lea
, les crochets ne signifie pas que:
lea eax, [ebp - 4]
La valeur de ebp
est soustraite par 4 et la valeur résultante est stockée dans eax
. Cette instruction ne ferait que calculer l'adresse et stocker la valeur calculée dans le registre de destination. Voir this post pour plus de détails.
Merci pour votre réponse, je commence à apprendre asm. Si je comprends bien, "mov al, [L1]" déplacerait "w" dans al, et "mov eax, L1" déplacerait l'adresse de L1 dans eax. Est-ce exact? – joek1975
oui. et si vous avez fait 'mov ebx, L1 - mov al, [ebx]' alors 'al' serait 'w' dans ce cas aussi. – Earlz
L'exception à cette règle est LEA. –