6

私が目にするほとんどの x86 アセンブリ (特に NASM) コード サンプル (GCC によって生成されたものでも) では、「スタック フレームのセットアップ」と呼ばれるものが見られます。このような:

main: 
        /*setting the stack frame*/
        push    ebp     
        mov     ebp,esp

        ...
        code goes here
        ...

        /*removing the stack frame*/
        mov     esp, ebp
        pop     ebp

この練習について 3 つの質問があります。

  1. コードがスタックに触れていない場合、上記のようにスタック フレームを設定/削除してもまったく意味がありません。

  2. 私のコードがスタックを使用していても、プッシュしたものすべてをポップする限り (基本的にはスタックをそのままにしておきます)、スタック フレームのセットアップはまったく役に立ちませんよね?

  3. 私が見る限り、これの唯一の目的は、ESP の値を保存して、混乱を招くことを心配せずに自分のコードでそれをいじることができるようにすることです。完了したら、元の値を復元するだけです。これはスタック フレームのセットアップの目的ですか、それとも何か不足していますか?

ありがとう

4

3 に答える 3

7

実際、スタック フレームは必要ありません。

スタック フレームは、レジスタを保存し、ローカル変数をスタックに格納する場合に便利です。これにより、書き込みとデバッグが容易になります。ebpスタック内の固定ポイントに設定し、ebp. espそして、最後に復元する方が簡単です。

また、デバッガーは多くの場合、スタック フレームが存在することを期待します。そうしないと、たとえば不正確なスタック呼び出しが発生する可能性があります。

したがって、1 の答えはイエスです。2 と 3 の答えは上記です。

于 2013-06-21T16:16:59.613 に答える
4

あなたは本質的に正しいです。

ただし、パラメーターやローカルにアクセスするために固定のスタック参照が必要ない場合でも、スタック フレームには一定の利点があります。特に、それらをそこに置くことで、デバッグ目的でスタック トレースを生成するための正確なスタック ウォーキングが可能になります。

于 2013-06-21T16:15:55.477 に答える
2

これは慣習によって行われます。C 言語関数はスタック フレームを使用して、関数に送信されるパラメーターにアクセスし、動的ローカル変数を設定します。それが、あなたが見ているサンプルコードでそれを行う理由です。もちろん、自分のやり方でやりたい場合はできますが、C などからコードを呼び出すことはできません。

EDIT:それを最適化し、おそらくフレームをまったく作成しないさまざまな呼び出し規約を実装するコンパイラーがあることも確信しています。基本的に、あなたは正しいです。スタック フレームは必要ありません。

于 2013-06-21T16:15:57.633 に答える