[解決済み】ベースポインタとスタックポインタとは一体何でしょうか?これらは何を指しているのでしょうか?
質問
使用方法 この例 この例では、DrawSquare() が DrawLine() を呼び出しています。
(この図では、ハイアドレスが下、ローアドレスが上になっていることに注意してください)
を説明できる人はいますか?
ebp
と
esp
は、この文脈の中にあるのでしょうか?
見たところ、スタックポインタは常にスタックの先頭を指し、ベースポインタは現在の関数の先頭を指すということでしょうか。それとも何ですか?
edit: ウィンドウズ・プログラムの文脈での意味です。
edit2: また、どのように
eip
も動作するのですか?
edit3です。 MSVC++の以下のようなコードがあります。
var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr 8
hPrevInstance= dword ptr 0Ch
lpCmdLine= dword ptr 10h
nShowCmd= dword ptr 14h
これらはすべてdwordsであり、したがってそれぞれ4バイトを要するようです。ですから、hInstanceからvar_4まで4バイトのギャップがあることがわかります。これは何でしょうか?wikipediaの画像にあるように、リターンアドレスだと思うのですが?
(編集部注:マイケルさんの回答から、質問にふさわしくない長文の引用を削除しましたが、フォローの質問が編集されています)。
というのも、関数呼び出しの流れは
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
私の質問(最後の質問です!)は、私が呼び出したい関数の引数をポップした瞬間から、Prologが終了するまで、一体何が起こっているのでしょうか?私はその間にebp, espがどのように変化するかを知りたいのです(私はすでにプロローグがどのように動作するかを理解しています、私はただ、スタックに引数をプッシュした後、プロローグの前に何が起こっているかを知りたいのです)。
どのように解決するのですか?
esp
はおっしゃるとおり、スタックの一番上です。
ebp
は通常
esp
を関数の先頭で使用します。関数のパラメータとローカル変数にアクセスするには、それぞれ、定数オフセットを
ebp
. すべての x86 呼び出し規約では
ebp
は、関数呼び出しの間、保存されます。
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バイトであると仮定します)。
mov [ebp-4], eax ; Store eax in first local
mov ebx, [ebp - 8] ; Load ebx from second local
FPOまたは
フレームポインターオミット
を有効にすることで、実際にこれを排除して
ebp
を別のレジスタとして使用し、ローカルに直接アクセスすることができます。
esp
しかし、この場合、デバッガは以前の関数呼び出しのスタックフレームに直接アクセスできなくなるため、デバッグが少し難しくなります。
EDIT
更新された質問に対して、スタックに欠けている2つのエントリは、次のとおりです。
var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4
*savedFramePointer = dword ptr 0*
*return address = dword ptr 4*
hInstance = dword ptr 8h
PrevInstance = dword ptr 0C
hlpCmdLine = dword ptr 10h
nShowCmd = dword ptr 14h
これは、関数呼び出しの流れが
-
パラメータをプッシュする (
hInstance
など) - 関数を呼び出し、戻り値のアドレスをプッシュする
-
プッシュ
ebp
- ローカル用スペースの確保
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】strcmpが機能しない
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み] ワードptrとは何ですか?
-
[解決済み] x86_64アセンブラのRBPレジスタは何のためにあるのですか?
-
[解決済み] コールスタックはどのように機能するのか?