Warum der anfängliche RAX-Push in dieser Funktionsaufruf-Assembly?
In der Assembly-Ausgabe des bereitgestellten C-Code-Snippets wird die Funktion f angezeigt ein erster Druck des RAX-Registers auf die Stapel.
Begründung
Der x64-ABI schreibt vor, dass die Stapelausrichtung 16 Byte vor einer Aufrufanweisung erfolgt. Da der Aufruf eine 8-Byte-Rücksprungadresse auf den Stapel schiebt und so die Ausrichtung stört, fügt der Compiler einen Push-Vorgang ein, um die Ausrichtung aufrechtzuerhalten.
Diese spezielle Wahl des Pushens eines Dummy-Werts ist für Prozessoren optimiert, die mit einer Stack-Engine ausgestattet sind , die den Push-Befehl im Vergleich zu sub rsp effizienter ausführen kann, 8.
Im Gegensatz dazu die g-Funktion, die einen einfachen Funktionsaufruf ohne den std::function-Wrapper ausführt, erfordert keine Anpassung der Stapelausrichtung und führt daher diesen ersten Push nicht aus.
Das obige ist der detaillierte Inhalt vonWarum enthält dieser Assemblercode ein anfängliches „Push Rax' vor einem Funktionsaufruf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!