は、我々一般的に関数から戻るとき:関数が返った後のespの値は何ですか? C/x86ので
pop ebp
は前の関数のフレームポインタを復元するために、呼び出し元の関数を継続できるという暗黙のpop eip
ので、含まれています(私が理解として)ret
復帰アドレスから実行するには
ここで、espにはどのようなものが含まれていますか?リターンアドレスの真上にあるものへのポインタか、または暗黙的にret
で変更されたespの値ですか?
感謝:)
は、我々一般的に関数から戻るとき:関数が返った後のespの値は何ですか? C/x86ので
pop ebp
は前の関数のフレームポインタを復元するために、呼び出し元の関数を継続できるという暗黙のpop eip
ので、含まれています(私が理解として)ret
復帰アドレスから実行するにはここで、espにはどのようなものが含まれていますか?リターンアドレスの真上にあるものへのポインタか、または暗黙的にret
で変更されたespの値ですか?
感謝:)
リターンアドレスの真上のポインタか、retによって暗黙的に変更されたespの値ですか?ただ
ret
とret N
:
はret
の2つの形式があります。最初のフォームは単純にpops eip(通常は "eipを取ってesp、4を追加"の両方を意味する)をスタックから取り出し、実行を続けるので、関数を呼び出すときに最後にpushされたパラメータを指しています。続いてadd esp, N
。
ret N
は、eipをポップした後、espが同じ命令の値Nによって追加されるため、呼び出し側がそれを行う必要はありません。欠点は、可変数のargsを使うことができないということです。なぜなら、 'N'は定数値でしかないからです。
これは非常に良い答えです。 – fuz
ret
後、esp
にはペテンの間で起こっていない場合はそれが正しい対応call
前と同じ値を含まなければなりません。 call
命令はスタックの戻り値をプッシュし、ret
命令はそれをポップします。そう、はい、あなたの直感は正しいです。
retの後、spは、関数の呼び出しが発生した時点と同じでなければなりません。
最後にスタックにプッシュされたものを指します。
CDECL呼び出し規約では、 'esp'は呼び出し前にスタックにプッシュされた最後のパラメータを指すようになりました。 –
このような疑問がある場合は、各命令の内容を詳しく説明したマニュアルをお読みください。 – fuz
@CodyGray: 'ret'はespに影響します:OPのようにリターンアドレスをポップします。正しいステートメントは、コール/リターンのペアがスタックに影響しないことです(呼び出し側が 'ret imm16'を使用する呼び出し側ではなくargsをポップする呼び出し規約を前提とします) –