4

次の画像は、コール スタックに関するウィキペディアのエントリからのもので、完全には理解できないものがあります。

代替テキスト

ebpレジスタに格納されているフレームポインタは、プロローグでそのように初期化されていると思いました*:

push ebp  ; Preserve current frame pointer 
mov ebp, esp ; Create new frame pointer pointing to current stack top 
sub esp, 20 ; allocate 20 bytes worth of locals on stack. 

もしそうなら、画像のフレームポインタはリターンアドレスの後、その前に前のフレームポインタアドレス、そしてその前にリターンアドレスを指すべきではありませんか?私は何が欠けていますか?

ありがとう!

*引用元:ベース ポインターとスタック ポインターとは正確には何ですか? 彼らは何を指していますか?

4

2 に答える 2

6

はい、そうです。フレーム ポインタは、戻りアドレスの前に、前のフレーム ポインタが格納されているアドレスを指します。正しい写真は

               | locals
               +---------
frame pointer->| prev frame pointer
               +--------
               | return address
               +--------
于 2010-12-13T06:36:48.200 に答える
0

関数が呼び出されたとき。戻りアドレスがスタックにプッシュされ、スタック ポインターが戻りアドレスを指すようになります。関数内では次のようになります。

push ebp  ; Push the ebp; The ebp address will pushed on stack and sp will be decremented
mov ebp, esp ;  EBP will now point the same as ESP which is previous value of EBP
sub esp, 20 ;    ESP will be subtracted further to create frame for local variables

結果は次のとおりです。EBP は EBP の前の値を指しています。ESP は、ESP からさらに 20 バイトを指しています。これらの 20 バイトは、ローカル変数に使用されます。

于 2010-12-13T06:37:34.020 に答える