Ausrichtung des Funktionsaufrufstapels
Im bereitgestellten Assemblercode könnte es verwirrend sein, zu sehen, dass RAX als erste Operation auf den Stapel geschoben wird innerhalb der Funktion f. Um die Gründe für diese Aktion zu verstehen, ist eine Untersuchung des 64-Bit-ABI erforderlich.
Das 64-Bit-ABI erfordert, dass der Stapel vor einem Aufrufbefehl auf 16 Byte ausgerichtet wird. Der Aufrufbefehl schiebt jedoch eine 8-Byte-Rücksprungadresse auf den Stapel, wodurch diese Ausrichtung gestört wird. Folglich ist der Compiler verpflichtet, Maßnahmen zu implementieren, um den Stapel auf ein Vielfaches von 16 neu auszurichten, bevor er mit dem nächsten Aufruf fortfährt.
In diesem Zusammenhang dient das Pushen eines egalen Werts, wie z. B. RAX, einem effizienter Zweck. Es bietet eine Möglichkeit, den Stapel auszurichten, ohne den Mehraufwand für die Ausführung einer zusätzlichen Sub-RSP-8-Anweisung zu verursachen, was auf CPUs, die mit einer Stapel-Engine ausgestattet sind, möglicherweise weniger effizient ist.
Der Vergleich mit einem Tailcall ohne Standard: :function Wrapper veranschaulicht dieses Prinzip. In der trivialen Funktion g kann der Compiler einfach eine JMP-Anweisung ohne vorherige Stapelausrichtungsaktionen ausführen. Im Fall von f ist jedoch der zusätzliche Push von RAX erforderlich, um die 16-Byte-Ausrichtung aufrechtzuerhalten und die Kompatibilität mit den ABI-Anforderungen sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum schiebt die Funktion „f' RAX vor anderen Operationen auf den Stapel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!