2016-05-29 42 views
0

コールスタック上に、プロシージャへの引数の位置と前のフレームへのポインタのアドレスを与えるフレームポインタがあります。また、返信先住所もあります。なぜそれは返還アドレスが必要ですか?私たちが行ったようにスタックフレームをポップするだけで、フレームポインタをスタックにバックアップすることはできませんか?リターンアドレスは単なる最適化ですか?返信先住所が必要なのはなぜですか?

+0

戻りアドレスには、復帰する命令のアドレスが含まれます。他の場所には格納されません。 – Jester

+0

フレームポインタは一般的に以前のスタックポインタです。リターンアドレスは前の命令ポインタです。 –

+0

フレームはオプションです。フレームポインタはオプションです。戻りアドレスはオプションではありません。また、分岐予測を改善するためにプロセッサ内部で大幅に最適化されています。 –

答えて

2

リターンアドレスが前のスタックフレームを指していない場合は、呼び出し元のメソッドの次の命令のコードセグメントを指します。

+0

「コードセグメントに」 - >これは私の睡眠が脳を奪われたことを思い起こさせ、私がどのように愚かなのかを思い起こさせるものでした。ありがとう! –

0

フレームは、パラメータとローカル変数の格納領域を指します。これを元の状態に戻すことはできますが、関数への呼び出しが行われたときに古い値が失われた命令ポインタは復元されません。

リターンアドレスは、保存された命令ポインタです。

1

復帰アドレスは、関数呼び出しがそのスタックを作成したコードセグメントまたは命令のアドレスを指します。バッファオーバーランの場合と同様に、脆弱性ごとに非常に重要なデータです。攻撃者は状態を損なう可能性があるアドレス空間を得ます。

関連する問題