DrawSquare() が 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 から var_4 までに 4 バイトのギャップがあることがわかります。彼らは何ですか?ウィキペディアの写真に見られるように、それは返送先住所だと思いますか?
(編集者注:質問に属さないマイケルの回答から長い引用を削除しましたが、フォローアップの質問が編集されました):
これは、関数呼び出しの流れが次のとおりであるためです。
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
私の質問 (最後、願っています!) では、呼び出したい関数の引数をポップした瞬間からプロローグの最後まで、正確には何が起こるのでしょうか? それらの瞬間にebp、espがどのように進化するかを知りたいです(プロローグがどのように機能するかはすでに理解しています。引数をスタックにプッシュした後、プロローグの前に何が起こっているかを知りたいだけです)。