15

x86アセンブリとフレームポインタを学ぶことは少し頭を悩ませています。私はこのSOの質問から、EBPがデバッグのために人生を素晴らしいものにすることを学びました。それは素晴らしいことですが、私は「EBPは他に何に使われているのか」と興味がありました。コールスタックのウィキペディアの記事を見ると、動的なスタック割り当てにはEBPが必要です。

私は常に動的割り当てがヒープ上にあるという仮定の下にありました。では、なぜ動的スタック割り当てを使用したいのでしょうか。ヒープが十分でないのはなぜですか。そして、EBPはこれにどのように役立ちますか?

4

2 に答える 2

22

ebpスタックフレームの割り当てに必要であると誤って想定しています。これは正しくありませんesp。直接使用できます。ebpをスタック フレーム ポインタとして使用することは、現在ではまったく必要ありません。いくつかのポイントがあり、便利でした:

  • 16 ビット コードでは、アドレッシングでの (スタック ポインター) の使用は厳しく制限されていました。x86 では、利用可能なすべてのアドレッシング モードspで相対アドレッシングを直接使用することはできませんでした。bp

  • この制限されたサポートの理由は、おそらく当時利用可能なコンパイラでしたsp. leaveまたはのようなスタックフレーム命令を特別にサポートするプロセッサは他にもたくさんありますがenter、私の知る限り、インテル以外の誰もspそのプロセスで実際のものを無効にすることはありません:-)

  • デバッグ。フレーム ポインターが使用できる場合、スタックをアンワインドするのははるかに簡単ですが、最新のデバッガーはそれがなくても実行できます。

スタックに 100 バイトのスペースを割り当てたい場合は、 を実行し、 0 から 99 までsub esp, #100のスペースにアクセスしてクリーンアップすれば完了です。手書きのアセンブリでスタック フレーム ポインタを使用することは、30 年前のコンパイラの動作をコピーするようなものだとさえ主張します。アセンブリを作成している場合、これはまったく必要ではなく、役に立ちません。move [esp + x]xadd esp, #100

于 2012-06-29T09:36:04.407 に答える
9

スタックからの少量のメモリの割り当ては、ヒープの割り当てに比べて非常に高速です。ヒープからメモリを割り当てるときは、API またはメモリ マネージャーを呼び出す必要があります。

はい、EBP レジスタは他の 32 ビット レジスタのような他の目的にも使用できますが、最初にその内容を保存し、その後手順を終了する前に復元する必要があります。

PUSH EBPEBP コンテンツのスタックへの格納とPOP EBP復元に使用できます。

于 2012-06-28T21:37:23.680 に答える