Signification de (% eax) dans la syntaxe AT & T?
-
06-07-2019 - |
Question
Vous devrez m'excuser, je suis novice dans l'assemblage x86 et l'assemblage en général.
Donc ma question est la suivante: j'ai quelque chose comme:
addl %edx,(%eax)
% eax est un registre qui contient un pointeur sur un entier. Appelons cela xp
Est-ce que cela signifie que cela signifie: * xp = * xp +% edx
? (% edx
est un entier)
Je ne comprends pas très bien où addl stockera le résultat. Si % eax
est un pointeur sur un int, alors (% eax)
doit être la valeur réelle de cet int. Ainsi, addl
stockera-t-il le résultat de % edx + (% eax)
dans * xp
? J'aimerais vraiment que quelqu'un m'explique cela!
J'apprécie vraiment toute aide!
La solution
Oui, cette instruction fait exactement ce que vous pensez faire.
La plupart des instructions arithmétiques x86 utilisent deux opérandes: une source et une destination. Dans la syntaxe AT & T (utilisée ici), la destination est toujours le bon opérande. Donc, avec une instruction comme:
addl %edx, %eax
les valeurs dans edx
et eax
sont additionnées et le résultat est stocké dans eax
. Cependant, dans votre exemple, (% eax)
est un opérande de la mémoire; c'est ce que signifient les parenthèses dans la syntaxe AT & T (comme les crochets dans la syntaxe NASM).
Cela signifie que eax
est traité comme un pointeur. Ainsi, l'opérande de droite est extrait de l'adresse indiquée par eax
et le résultat est stocké à la même adresse. .