ホームページ >バックエンド開発 >C++ >このアセンブリ コードには、関数呼び出しの前に最初の `push rax` が含まれているのはなぜですか?

このアセンブリ コードには、関数呼び出しの前に最初の `push rax` が含まれているのはなぜですか?

DDD
DDDオリジナル
2024-12-15 18:55:10192ブラウズ

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

この関数呼び出しアセンブリで最初の RAX プッシュを行うのはなぜですか?

提供された C コード スニペットのアセンブリ出力では、関数 f が次のように表示されます。 RAX レジスタの最初のプッシュstack.

根拠

x64 ABI では、呼び出し命令の前にスタック アライメントを 16 バイトにすることが義務付けられています。呼び出しは 8 バイトの戻りアドレスをスタックにプッシュし、アライメントを中断するため、コンパイラーはアライメントを維持するためにプッシュ操作を挿入します。

ダミー値をプッシュするこの特定の選択は、スタック エンジンを搭載したプロセッサー用に最適化されています。 8.

対照的に、g 関数は、sub rsp と比較して、より効率的にプッシュ命令を実行できます。 std::function ラッパーは、スタックのアライメント調整を必要としないため、この初期プッシュは実行されません。

以上がこのアセンブリ コードには、関数呼び出しの前に最初の `push rax` が含まれているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。