Heim > Backend-Entwicklung > C++ > Warum enthält dieser Assemblercode ein anfängliches „Push Rax' vor einem Funktionsaufruf?

Warum enthält dieser Assemblercode ein anfängliches „Push Rax' vor einem Funktionsaufruf?

DDD
Freigeben: 2024-12-15 18:55:10
Original
189 Leute haben es durchsucht

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

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage