Qu'est-ce que callq de l'enseignement?
J'ai quelques assembleur gnu code pour l'architecture x86_64 généré par un outil et il y a ces instructions:
movq %rsp, %rbp
leaq str(%rip), %rdi
callq puts
movl $0, %eax
Je ne trouve pas de documentation disponible sur le "callq" de l'enseignement.
J'ai regardé http://support.amd.com/TechDocs/24594.pdf qui est "AMD64 Architecture Programmer's Manual Volume 3: à des Fins Générales et Instructions du Système", mais ils ne décrivent que l'APPEL de près et de loin instructions.
J'ai regardé la documentation pour l'assembleur gnu https://sourceware.org/binutils/docs/as/index.html, mais ne pouvait pas trouver la section détaillant les instructions qu'il prend en charge.
Je comprends que c'est un appel à une fonction, mais j'aimerais en connaître les détails. Où puis-je les trouver?
Je n'ai pas trouvé les questions existantes sur
callq
spécifiquement. Et il est en fait la non-évidence des choses à dire à propos de défaut opérande-tailles de branches et d'autres de la pile d'instructions. C'est une question de newbie, mais en fait qui vaille la peine de répondre pour un changement, si je cesse d'être grincheux avec toutes les mauvaises "mon code ne fonctionne pas et je ne sais rien".OriginalL'auteur user10607 | 2017-10-15
Vous devez vous connecter pour publier un commentaire.
C'est juste
. Utilisez Intel-syntaxe démontage si vous voulez être en mesure de regarder les instructions dans le processeur Intel/AMD manuels.
La
q
opérande de taille suffixe n'est théoriquement s'appliquer (il pousse un 64 bits de l'adresse de retour et des friandises RIP comme une version 64 bits du registre), mais il n'y a aucun moyen de le remplacer avec de l'instruction de préfixes. c'est à direcalll
etcallw
ne sont pas encodeable en mode 64 bits, de sorte qu'il est tout simplement ennuyeux que certains AT&T syntaxe des outils de montrer que lescallq
au lieu decall
. Bien sûr, cela s'applique àretq
.Différents outils sont différents en 32 et 64 bits de mode. (Godbolt)
call
/ret
. Nice.callq
/retq
etcalll
/retl
. Au moins il est constamment ennuyeux.objdump -d:
callq
/retq
(explicite 64 bits) etcall
/ret
(implicite pour 32-bit). Incohérent et un peu stupide, parce que le 64 bits n'a pas le choix de l'opérande de taille, mais 32-bit. (Pas un utile choix:callw
tronque EIP à 16 bits.)Bien que de l'autre main, la valeur par défaut la taille de l'opérande (sans REX.W préfixe) pour plus des instructions en 64-bits mode est encore 32. Mais
add $1, (%rdi)
besoin d'un opérande de taille suffixe; l'assembleur ne prendra pas les 32-bit pour vous si de rien n'implique qu'un. Otoh, que,push
est implicitementpushq
, même sipushw $1
etpushq $1
sont à la fois encodeable (et utilisable dans la pratique) en mode 64 bits.De Intel instruction-set ref manuel (lien ci-dessus):
En mode 32 bits, vous pouvez encoder un 16 bits
call rel16
qui tronque les EIP à 16 bits, ou uncall r/m16
qui utilise un absolu de 16 bits de l'adresse. Mais comme le manuel dit, l'opérande de taille est fixe en mode 64 bits.OriginalL'auteur Peter Cordes
callq se réfère à une transférable, l'appel en shared libraries/bibliothèques dynamiques. L'idée est d'appuyer sur 0, puis poussez le symbole de rechercher puis d'appeler une fonction pour effectuer une recherche sur le premier appel. Dans le transférable tableau du programme, il remplace l'appel à l'emplacement réel de la fonction sur le premier appel de la fonction. Les appels ultérieurs, reportez-vous à la relocalisation de la table qui a été créée au moment de l'exécution.
gcc -fno-plt
n'début de la liaison, d'inlining indirectecallq *puts@GOT(%rip)
. Lecallq
mnémonique n'impliquent pas l'utilisation de la PLT, et est même utilisé pour les appels entre les fonctions dans le même fichier.OriginalL'auteur Shawn Miller