2010-01-08 7 views

Répondre

34

[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').

+4

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

+4

oui. et si vous avez fait 'mov ebx, L1 - mov al, [ebx]' alors 'al' serait 'w' dans ce cas aussi. – Earlz

+3

L'exception à cette règle est LEA. –

5

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.

1

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.

1

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.

0

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.

25

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

+0

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

+11

@ user2485710 Non, 'p 'signifie déréférencer le caractère pointé par' p'. Les cordes n'ont rien à voir avec ça. – Navin

20

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.

Questions connexes