WikiSquare()がDrawLine()を呼び出すウィキペディアからのこの例を使用すると、
(この図の下部には高いアドレスがあり、上部には低いアドレスがあることに注意してください。)
誰かが私に何ebp
を説明してくれesp
ますか?
私が見るところから、スタックポインターは常にスタックの先頭を指し、ベースポインターは現在の関数の先頭を指していると思いますか?または何?
編集:これはWindowsプログラムのコンテキストでこれを意味します
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
それらはすべてdwordのようで、それぞれ4バイトを使用します。したがって、hInstanceから4バイトのvar_4へのギャップがあることがわかります。彼らは何ですか?ウィキペディアの写真に見られるように、私はそれが戻りアドレスだと思いますか?
(編集者のメモ:質問に属さないマイケルの回答から長い引用を削除しましたが、フォローアップ質問が編集されました):
これは、関数呼び出しのフローが次のとおりであるためです。
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
私の質問(最後に、私は願っています!)は、私が呼び出したい関数の引数をポップした瞬間からプロローグの最後まで正確に何が起こるのでしょうか?ebp、espがそれらの瞬間にどのように進化するかを知りたいです(プロローグがどのように機能するかはすでに理解しています、スタックに引数をプッシュした後、プロローグの前に何が起こっているのか知りたいだけです)。