web-dev-qa-db-fra.com

Quelle est la différence entre 'Push' et 'pushq' dans l'assemblage at & t

J'ai récemment commencé à chercher à mieux comprendre le fonctionnement de mon ordinateur. Ma question concerne les différences entre Push et pushq.

Je suis conscient que Push écrit une valeur dans la pile et mon hypothèse est que pushq fait quelque chose de similaire. Le fait que le q soit là me fait penser qu'il devrait y avoir une différence subtile mais je n'arrive pas à comprendre la différence.

J'ai déclaré de réfléchir à cette question lors du débogage du fichier/lib/udev/iphone-set-info en utilisant gdb avec la commande 'layout asm'.

le code en question est:

pushq  $0x0
Push   %r9

Je comprends que $ 0x0 est hexadécimal pour NULL et que% r9 est l'un des registres généraux. Est-ce que cela signifie simplement que Null nous a écrit dans la pile avec le registre% r9 écrit au-dessus?

10
user6090272

Je ne sais pas quel langage d'assemblage vous utilisez, mais cela est vrai pour GAS (assembleur GNU) qui utilise également la syntaxe AT&T: les instructions d'assemblage GAS sont généralement suffixées avec les lettres "b", "s", "w", " l "," q "ou" t "pour déterminer quelle taille d'opérande est manipulée.

  • b = octet (8 bits)
  • s = court (entier 16 bits) ou simple (virgule flottante 32 bits)
  • w = Word (16 bits)
  • l = long (entier 32 bits ou virgule flottante 64 bits)
  • q = quad (64 bits)
  • t = dix octets (virgule flottante 80 bits)

Si le suffixe n'est pas spécifié et qu'il n'y a pas d'opérandes mémoire pour l'instruction, GAS déduit la taille de l'opérande à partir de la taille de l'opérande du registre de destination (l'opérande final).

pushq $0x0 pousse juste 8 octets zéro à empiler. Ensuite Push %r9 définit que %r9 est un registre 64 bits et pousse sa valeur à empiler.

Le fait intéressant sur la pile qu'elle grandit, donc les octets nuls auront des adresses plus élevées que la valeur de %r9, donc ici peut être un malentendu, car en fait la valeur de %r9 est inférieur aux octets nuls.

6
Keltar Helviett