Maison > développement back-end > C++ > Pourquoi la fonction « f » pousse-t-elle RAX sur la pile avant d'autres opérations ?

Pourquoi la fonction « f » pousse-t-elle RAX sur la pile avant d'autres opérations ?

Susan Sarandon
Libérer: 2024-12-08 08:18:11
original
435 Les gens l'ont consulté

Why Does the Function `f` Push RAX onto the Stack Before Other Operations?

Alignement de la pile d'appels de fonction

Dans le code assembleur fourni, il peut être déroutant de voir RAX être poussé sur la pile comme première opération dans la fonction f. Comprendre le raisonnement derrière cette action nécessite un examen de l'ABI 64 bits.

L'ABI 64 bits exige que la pile soit alignée sur 16 octets avant une instruction d'appel. Cependant, l'instruction d'appel pousse une adresse de retour de 8 octets sur la pile, perturbant cet alignement. Par conséquent, le compilateur est obligé de mettre en œuvre des mesures pour réaligner la pile à un multiple de 16 avant de passer au prochain appel.

Dans ce contexte, pousser une valeur indifférente, telle que RAX, sert un objectif efficace. Il fournit un moyen d'aligner la pile sans encourir la surcharge liée à l'exécution d'une instruction sub rsp, 8 supplémentaire, qui peut être moins efficace sur les processeurs équipés d'un moteur de pile.

La comparaison avec un tailcall sans std : :function wrapper illustre ce principe. Dans la fonction triviale g, le compilateur peut simplement exécuter une instruction jmp sans aucune action préalable d'alignement de pile. Cependant, dans le cas de f, une poussée supplémentaire de RAX est nécessaire pour maintenir l'alignement sur 16 octets, garantissant ainsi la compatibilité avec les exigences ABI.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal