การใช้ตัวอย่างนี้มาจากวิกิพีเดียซึ่ง 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
พวกเขาทั้งหมดดูเหมือนจะเป็น dwords ดังนั้นจึงใช้เวลา 4 ไบต์ต่อครั้ง ดังนั้นฉันจะเห็นว่ามีช่องว่างจาก hInstance ถึง var_4 จาก 4 ไบต์ พวกเขาคืออะไร ฉันคิดว่ามันเป็นที่อยู่ผู้ส่งคืนตามที่เห็นในรูปภาพของวิกิพีเดีย
(หมายเหตุบรรณาธิการ: ลบคำพูดยาว ๆ ออกจากคำตอบของ Michael ซึ่งไม่ได้อยู่ในคำถาม แต่มีการแก้ไขคำถามติดตาม):
นี่เป็นเพราะการไหลของการเรียกใช้ฟังก์ชันคือ:
* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals
คำถามของฉัน (สุดท้ายฉันหวังว่า!) ตอนนี้คือสิ่งที่เกิดขึ้นจากทันทีที่ฉันปรากฏข้อโต้แย้งของฟังก์ชั่นที่ฉันต้องการเรียกจนถึงจุดสิ้นสุดของการเปิดฉาก? ฉันต้องการที่จะรู้ว่า ebp, esp วิวัฒนาการในช่วงเวลาเหล่านั้น (ฉันได้เข้าใจแล้วว่าการทำงานของอารัมภบททำงานอย่างไรฉันแค่อยากจะรู้ว่าเกิดอะไรขึ้นหลังจากที่ฉันผลักข้อโต้แย้งไปที่กองซ้อน