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
Susan Sarandonoriginal
2024-12-08 08:18:11402parcourir

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!

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