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?
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.
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.