99

私はアセンブリ言語の初心者であり、コンパイラーによって発行されたx86コードは、通常、EBPレジスターを他の目的に使用できる場合、リリース/最適化モードでもフレームポインターを保持していることに気付きました。

フレームポインタがコードのデバッグを容易にしalloca()、関数内でが呼び出された場合に必要になる理由を理解しています。ただし、x86にはレジスタがほとんどないため、1つで十分な場合に、スタックフレームの位置を保持するために2つのレジスタを使用することは、私には意味がありません。最適化/リリースビルドでもフレームポインタを省略することが悪い考えと見なされるのはなぜですか?

4

5 に答える 5

104

フレーム ポインターは、デバッガーが単一の定数オフセットでローカル変数または引数がどこにあるかを知ることができる参照ポインターです。ESP の値は実行中に変化しますが、EBP は同じままであるため、同じオフセットで同じ変数に到達することができます (たとえば、最初のパラメーターは常に EBP+8 になりますが、ESP オフセットはプッシュするため大幅に変化する可能性があります)。 /飛び出るもの)

コンパイラがフレームポインタを捨てないのはなぜですか? フレーム ポインターを使用すると、デバッガーは、ローカル変数と引数がシンボル テーブルを使用している場所を把握できます。これらは、EBP への一定のオフセットにあることが保証されているためです。そうしないと、ローカル変数がコード内のどこにあるかを把握する簡単な方法がありません。

Greg が述べたように、EBP はスタック フレームの逆リンク リストを提供し、デバッガが関数のスタック フレーム (ローカル変数 + 引数) のサイズを把握できるようにするため、デバッガのスタック アンワインドにも役立ちます。

ほとんどのコンパイラは、デバッグを非常に困難にしますが、フレーム ポインターを省略するオプションを提供します。このオプションは、リリース コードであっても、グローバルに使用しないでください。ユーザーのクラッシュをいつデバッグする必要があるかわかりません。

于 2009-02-23T20:55:59.293 に答える
31

すでに良い答えに私の2セントを追加するだけです。

スタック フレームのチェーンを持つことは、優れた言語アーキテクチャの一部です。BP は、サブルーチン ローカル変数が格納されている現在のフレームを指します。(ローカルは負のオフセットにあり、引数は正のオフセットにあります。)

完全に適切なレジスターが最適化に使用されるのを妨げているという考えは、いつ、どこで最適化が実際に価値があるのか​​という疑問を提起します。

最適化は、1) 関数を呼び出さない、2) プログラム カウンターがその時間のかなりの部分を費やす場所、3) コンパイラが実際に目にするコード (つまり、非ライブラリ関数) のタイトなループでのみ価値があります。これは通常、特に大規模なシステムでは、コード全体のごく一部です。

他のコードは、循環を取り除くためにひねったり圧縮したりすることができますが、プログラム カウンターは実質的に存在しないため、まったく問題になりません。

あなたがこれを尋ねていないことは知っていますが、私の経験では、パフォーマンスの問題の 99% はコンパイラの最適化とはまったく関係がありません。それらは過剰設計と関係があります。

于 2009-02-24T21:43:25.867 に答える
9

確かに、それはコンパイラに依存します。EBPレジスタを汎用レジスタとして自由に使用するx86コンパイラによって発行される最適化されたコードを見てきました。(ただし、どのコンパイラで気づいたかは覚えていません。)

コンパイラーは、例外処理中のスタックの巻き戻しを支援するためにEBPレジスターを維持することも選択できますが、これも正確なコンパイラーの実装に依存します。

于 2009-02-23T20:49:53.117 に答える
4

ただし、x86 にはレジスタがほとんどありません。

これは、オペコードが 8 つのレジスタしかアドレス指定できないという意味でのみ当てはまります。プロセッサ自体には、実際にはそれよりも多くのレジスタがあり、レジスタの名前変更、パイプライン処理、投機的実行、およびその他のプロセッサの流行語を使用して、その制限を回避します。ウィキペディアには、x86 プロセッサがレジスタ制限を克服するために何ができるかについての優れた紹介段落があります: http://en.wikipedia.org/wiki/X86#Current_implementations

于 2009-02-23T21:00:41.297 に答える
1

スタックフレームの使用は、リモートで最新のハードウェアでも信じられないほど安価になっています。安価なスタックフレームがある場合は、いくつかのレジスタを保存することはそれほど重要ではありません。高速スタックフレームとより多くのレジスターはエンジニアリングのトレードオフであり、高速スタックフレームが勝ったと確信しています。

純粋なレジスターをいくら節約できますか?その価値はありますか?

于 2009-02-23T20:51:58.993 に答える