この関数呼び出しアセンブリで最初の RAX プッシュを行うのはなぜですか?
提供された C コード スニペットのアセンブリ出力では、関数 f が次のように表示されます。 RAX レジスタの最初のプッシュstack.
根拠
x64 ABI では、呼び出し命令の前にスタック アライメントを 16 バイトにすることが義務付けられています。呼び出しは 8 バイトの戻りアドレスをスタックにプッシュし、アライメントを中断するため、コンパイラーはアライメントを維持するためにプッシュ操作を挿入します。
ダミー値をプッシュするこの特定の選択は、スタック エンジンを搭載したプロセッサー用に最適化されています。 8.
対照的に、g 関数は、sub rsp と比較して、より効率的にプッシュ命令を実行できます。 std::function ラッパーは、スタックのアライメント調整を必要としないため、この初期プッシュは実行されません。
以上がこのアセンブリ コードには、関数呼び出しの前に最初の `push rax` が含まれているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。