Maison >développement back-end >C++ >Pourquoi ce code assembleur inclut-il un « push rax » initial avant un appel de fonction ?

Pourquoi ce code assembleur inclut-il un « push rax » initial avant un appel de fonction ?

DDD
DDDoriginal
2024-12-15 18:55:10190parcourir

Why Does This Assembly Code Include an Initial `push rax` Before a Function Call?

Pourquoi le Push RAX initial dans cet assemblage d'appel de fonction ?

Dans la sortie d'assemblage de l'extrait de code C fourni, la fonction f affiche une première poussée du registre RAX vers le stack.

Justification

L'ABI x64 exige que l'alignement de la pile soit de 16 octets avant une instruction d'appel. Puisque l'appel pousse une adresse de retour de 8 octets sur la pile, perturbant l'alignement, le compilateur insère une opération push pour maintenir l'alignement.

Ce choix spécifique de pousser une valeur factice est optimisé pour les processeurs équipés d'un moteur de pile , qui peut exécuter l'instruction push plus efficacement que le sub rsp, 8.

En revanche, la fonction g, qui effectue un simple appel de fonction sans le wrapper std::function, ne nécessite pas d'ajustement de l'alignement de la pile et n'exécute donc pas cette poussée initiale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn