2016-06-26 11 views
3

は、我々一般的に関数から戻るとき:関数が返った後のespの値は何ですか? C/x86ので

  1. pop ebpは前の関数のフレームポインタを復元するために、呼び出し元の関数を継続できるという暗黙のpop eipので、含まれています(私が理解として)
  2. ret復帰アドレスから実行するには

ここで、espにはどのようなものが含まれていますか?リターンアドレスの真上にあるものへのポインタか、または暗黙的にretで変更されたespの値ですか?

感謝:)

+0

CDECL呼び出し規約では、 'esp'は呼び出し前にスタックにプッシュされた最後のパラメータを指すようになりました。 –

+2

このような疑問がある場合は、各命令の内容を詳しく説明したマニュアルをお読みください。 – fuz

+1

@CodyGray: 'ret'はespに影響します:OPのようにリターンアドレスをポップします。正しいステートメントは、コール/リターンのペアがスタックに影響しないことです(呼び出し側が 'ret imm16'を使用する呼び出し側ではなくargsをポップする呼び出し規約を前提とします) –

答えて

8

リターンアドレスの真上のポインタか、retによって暗黙的に変更されたespの値ですか?ただretret N

retの2つの形式があります。最初のフォームは単純にpops eip(通常は "eipを取ってesp、4を追加"の両方を意味する)をスタックから取り出し、実行を続けるので、関数を呼び出すときに最後にpushされたパラメータを指しています。続いてadd esp, N

ret Nは、eipをポップした後、espが同じ命令の値Nによって追加されるため、呼び出し側がそれを行う必要はありません。欠点は、可変数のargsを使うことができないということです。なぜなら、 'N'は定数値でしかないからです。

+0

これは非常に良い答えです。 – fuz

2

ret後、espにはペテンの間で起こっていない場合はそれが正しい対応call前と同じ値を含まなければなりません。 call命令はスタックの戻り値をプッシュし、ret命令はそれをポップします。そう、はい、あなたの直感は正しいです。

1

retの後、spは、関数の呼び出しが発生した時点と同じでなければなりません。

最後にスタックにプッシュされたものを指します。

関連する問題