2017-10-19 13 views
0

スタックが下向きに成長し、EBPがスタックの底を指している場合、なぜこのような操作がmov eax [ebp + 4]と表示されますか?現在のスタックフレームの外部で変数を参照していないでしょうか?ポジティブEBP参照の目的は何ですか?

+0

ebp + offsetは関数変数を参照するために使用されます –

+0

関数変数はどういう意味ですか?私はそれが呼び出し規約に依存すると思うが、私の理解は、パラメータがスタックにプッシュされる(したがって、負の参照である)か、またはレジストリに格納されるということです。 –

+2

'[ebp + 4]'は、 'push ebp' /' mov ebp、esp'を実行して関数の先頭に何かを押すと 'call'命令によってプッシュされた戻りアドレスを保持します。 '[ebp + 8]'は最初の(非登録)* arg * /パラメータです。 (ローカル変数ではありません) –

答えて

3

引数は、関数が呼び出される前にスタックにプッシュされます。

機能の開始時に、EBPが保存される必要がある他のレジスタと同様にプッシュされ、EBPがESPに等しく設定されます。

Cの自動変数のように関数内で宣言された変数がある場合、ESPはそれらの変数を保持するためにEBPとESPの間のスペースを残すために減分されます。

したがって、引数にはEBP+offset、ローカル変数にはEBP-offsetが使用されます。

関数が返る前に、ESPはEBPに戻され、スタックは解放されます。

+0

ありがとうございました!私はEBPが設定されたときに誤解を抱いていました。 –

+1

'ebp-offset'はローカル変数、' ebp + offset'は引数です。 (反対に)。そして、espは減分され(減算され)、ローカル変数のための領域が作成されます。スタックは下に "成長"します。 OPは実際に彼の質問でうまく理解しています。彼は自分のコードを呼び出す直前にスタックに格納されている値(呼び出し引数)が「外部」であることを認識していませんでした。 @JacobPersi – Ped7g

関連する問題