الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال بخصوص ال stack frame

مغلق
بدأه allko في 3 مارس 2006 · 8 رد · 1,062 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

نعلم جميعا ان الـ stack frame يتم فتحه في بداية procedure ثم يتم اغلاقه ...

push EBP
mov EBP,ESP
....
mov ESP,EBP
pop EBP

اولا اريد توضيحا لفائدة EBP اي ما هي القيم التي تخزن فيه.

ثانيا ، لم لا يتم استخدام الصيغة التالية المكافئة

push esp
pop esp

لانه كما تلاحظون من الصيغة الاولى اننا وضعنا محتويات esp في ebp وبعد تنفيذنا للـ procedure

لم يحصل اي تغيير على ebp بدليل اننا قمنا بنقل القيمة المخنة فيه (هي بالاصل قيمة esp) الى esp

اي باختصار، ebp لا يتغير...لذا لا حاجة للاقتراب منه...بدلا من ذلك نقوم بتخزين قيمة esp في الـ stack ثم نعيدها كما كانت بعد ان ننتهي...

هل هذا صحيح ام لا؟

#2

السلام عليكم

اخى allko عندك بعض اللبس فى فهم الاستاك فريم دعني اشرح لك بإختصار..

الاستاك فريم هى ذاكرة لها بداية ولها نهاية, عنوان البداية موجود فى EBP وعنوان النهاية موجود فى ESP.

إذا اردت الحفاظ على عناوين الذاكرة يجب ان تحتفظ اولاً بالEBP وذلك عبر عمل push له ثم يكون بداية الاستاك الجديد هو نهاية الاستاك القديم لذلك نقوم بوضع المؤشر ESP فى المؤشر EBP وعندما ننتهي نقوم بإعادة المؤشر ESP و EBP لمكانهما السابق.

ارجو ان تكون الصورة اتضحت ...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

أخي allko , الصورة ليست بهذا الشكل

push EBP
mov EBP,ESP
....
mov ESP,EBP
pop EBP

بل بهذا الشكل

push EBP
mov EBP,ESP
....
pop EBP

طيب وما الفرق ؟

الفرق ان الأول معناه انني استخدمت EBP كمخزن للـ ESP لحين العودة من الدالة وقبل العودة يتم استرجاعها >>> خطأ

الثاني هو ما يحدث بالفعل , نحفظ قيمة EBP ايا كان المقصود بقيمتها قبل استدعاء الدالة وهذا لاسترجاع قيمتها قبل الخروج من الدالة , بعد حفظ قيمة EBP في المكدس نقوم بوضع قيمة ESP في ال EBP بهدف جعله مؤشر للمتغيرات الداخلية في الدالة , وبعد الانتهاء من الدالة يتم استرجاع قيمة EBP من المكدس مره اخرى , لاحظ ان قيمة ESP لم يتم تغييرها اصلا ولا الاقتراب منها

يبقى معنى الوظيفة دي :

temp = EBP; حفظت الـ EBP
EBP = ESP; احتاج قيمة الـ ESP اثناء تنفيذ الدالة
....
....
EBP = temp; استرجعتها تاني
ret

هذا والله اعلم

#4

اسف على التاخر بالرد

شكرا لكما على الشرح...اعتقد انه مازال هناك بعض اللبس...عموما ساقوم بتنقيح احد البرامج بال olly واتابع ال stack جيدا علني افهم

وان لم افهم ساطرح تساؤلاتي هنا...

شكرا

#5

شكرا جزيلا للردود...قمت بتتبع احد الـ PROCEDURES التي تبدا بـ

PUSH EBP

MOV EBP,ESP

وتنتهي بـ

MOV ESP,EBP

POP EBP

RETN

وتوصلت الى التالي...

تشير EBP الى عنوان بداية المكدس بينما تشير ESP الى نهايته...وعندما ننفذ الامر الاول فاننا نحفظ قيمة بداية المكدس من الضياع

05_03_06_01_33_48_11415944281.JPG

وعندما ننفذ الامر الثاني(MOV EBP,ESP) فاننا ايضا نحفظ قيمة نهاية المكدس من الضياع (لان EBP التي اصبحت تحوي قيمة نهاية المكدس ، لا تتغير - بشكل عام - مع استمرار البرنامج) . (لاحظ ان EBP=ESP الان)

05_03_06_01_34_28_1141594468_.JPG

اثناء عمل الـ PROCEDURE فهناك بعض الاوامر كـ PUSH & POP تغير المكدس ، في الواقع يتم انشاء مكدس جديد (او لنقل مكان جديد) بدايته هي نهاية المكدس القديم ونهايته تتغير بحسب الاوامر (كل امر PUSH يزيد من حجم المكدس وكل امر POP ينقصه) .

وفي النهاية فاننا بعد الانتهاء من تلك الـ PROCEDURE فاننا نرغب في العودة الى المكدس الاصلي لذا فاننا نجد ان EBP اصبحت تحوي قيمة قريبة من قيمة نهاية المكدس الاصلي ، اما البداية فانها قد خزنت في المكدس ونستعيدها بامر POP EBP .

05_03_06_01_36_12_11415945723.JPG

هل...هذا صحيح؟

#6
اقتباس
هل...هذا صحيح؟
#7

السلام عليكم

النقطة الاولى صحيحة, نحن نحفظ قيمة EBP بعمل push للقيمة, لاحظ ان القيمة التى توجد تحتها هى return adress يعنى عنوان العوده إلى المكان الذى استدعيت منه هذه الدالة, نعود لهذا العنوان بواسطة الامر RETN او RET ..

النقطة الثانية غير صحيحة نحن لسنا بحاجة لحفظ ESP ما نقوم به بإختصار هو تحديد ستاك جديد وبدايته هى نهاية الاستاك القديم, عندما نقوم بحفظ ESP فى المسجل EBP مانفعله هو تحديد بداية الاستاك الجديد وليس عملية حفظ..

النقطة الثالثة صحيحة ولاحظ ان كل عملة push لابد ان يكون لها عملية pop وإلى لن نصل لعنوان العودة عند الانتهاء من الدالة..

النقطة الرابعة لا اعرف إذا كنت تقصد ما فهمته من كلامك ولكن بما ان كل عملية push تتبعها pop اجلاً او عاجلاً فلا بد ان نصل لنهاية المكدس عندما نصل لنهاية الدالة وكل ما علينا القيام به هو علمية pop حتى نستعيد قيمة EBP وبعد ذلك عملية RET حتى نعود للعنوان القديم, اما بالنسبة للESP فإنها تحصل على قيمتها القديمة لان القيمة القديمة هى العنوان الذي يسبق عنوان العودة, يعنى بعد ان نقوم بعملية ret فمؤشر ESP سيعود لمكانه الطبيعي دون حفظ كما هو الحال بالنسبة لـEBP..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#8

شكرا على الرد...اعتقد ان لدي الان فكرة جيدة عن الموضوع...والتفاصيل تاتي مع الخبرة والتجريب...

هذا الموضوع مغلق.

مواضيع مشابهة