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

سؤال بسيط في الاسمبلي عن ال stack

مغلق
بدأه فارس2005 في 11 أكتوبر 2004 · 34 رد · 4,412 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

انا مبتدأ أسمبلي وأريد استخدام برنامج الdebug لاري سير العمليات

واريد برنامج صغير يضع قيمة في ax وقيمة اخري في bx واعمل push لهما

في ss واريد ان اري تلك القيم التي حولناها من ال ax, bx الي ال ss واريد كذلك انهما تحولتا من ax, bx

وشكرا

#2

إفتح الديبغ عندك و كتب كالتالي

A
MOV  AX,XXXX
MOV	BX,XXXX
PUSH	AX
PUSH	DX
[ENTER]
R
T
T
T
T
D  SS:[SP]
Q

A تقوم بإدخال كود إسمبلي

MOV نقل قيمة إلى المسجل

PUSH الدفع

R عرض المسجلات

T تنفيذ كود الإسمبلي

D رؤية المكدس

ملاحظة

XXXX قيم أنت تختارها

[sP] إكتب القيمة الموجودة عند هذا المسجل

بالتوفيق

#3

شكرا علي الرد

ولكن الاحظ انه عند استخدام ال push فانه يطبع القيمة في ال stack ولا يزيحها من مكانها الذي هو في ax مثل ما انا فكرت مثل ولكن وجدت ان القيماتان في موجودتان في ال ax و ال stack لمذا؟؟؟؟

#4

السلام عليكم

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

والسلام

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

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

#5

السلام عليكم,

فعلا الأمور هي هكذا كما قلت. حين تقوم بعمل push ax أو أي رجستر آخر فأنك كما تقوم بعمل نسخة للرجستر والإحتفاظ بها في الستاك وتبقى قيمة الرجستر كما هي ولا تتغير بهذه العملية.

وعملية push في هذه الحالات قد تفيدنا في مثل الحالات التالية .

push ax نحتفظ بقيمة الرجستر في الستاك

mov ax,othervariable نغير قيمة الرجستر أو نستعمل الرجستر لأشياء أخرى وعندما ننتهي من هذه العملية ونريد استرجاع قيمة الرجستر التي احتفظنا بها نسترجعها بالتعليمة pop كما يلي : pop ax وهنا نستعيد القيمة التي احتفظنا بها.

إلى اللقاء.

#6

للمعلومة عند تخزين البيناتات في الذاكرة

تكون مقلوبة

جرب دفع قيمة و لتكن

0123

ستكون في الذاكرة

2301

بالتوفيق

#7

واجهتني مشكلة في هذا البريمج البسيط

mov ax,5
push ax
add ax,6
mov bx,[sp]
pop ax

المشكلة واجهتني في الديبق في سطر mov bx,[sp] حيث ات الديبق اعتبر وجود خطا واريد ان انقل محتويات sp بعد عمل دفع له الي ال xb

#8

السلام عليكم,

ليست على بالي الآن كل التعليمات ولكن يجب التأكد أولا إن كانت التعليمة

mov register,[sp] موجودة.

وعلى كل حال يمكن أن تكتب برنامجك ببساطة كما يلي :

mov ax,5
push ax
add ax,6
pop bx
mov ax,bx

إلى اللقاء.

#9

انا جربت كذلك mov bx,[ax] الديبق اظهر رسالة خطأ مع العلم ان الامر صحيح

#10

إنت تعرف شو معناة أقواس في البداية !!!

#11

السلام عليكم,

نعم لو تكتب

mov bx,[ax]

سيعطيك خطأ لأن فيما يخص مؤشرات الذاكرة يجب أن نستعمل الرجسترات الخاصة بذلك وهي مثلا si di bp bx

فمثلا لو نغير التعليمة السابقة سيقبلها الديبوغر مثلا .

mov ax,[bx]

بينما مثلا في الأسمبلر 32 بايت يمكن أن نستعمل أي رجستر للإشارة إلى الذاكرة بدون أي مشكل.

إلى اللقاء.

#12

أولا الاقواس اعرف انها تحتوي علي عنوان ازاحة في الذاكرة واسترجاع ما بها من قيمة

وفعلت من منطلق فهمي في الديبق ووضعت عنوان ازاحة ذاكرة في ال ax كي يستعملها الديبق في جلب القيمة المخزنه في ذلك العنوان

ولكن اريد توضح اكثر من الاخ chik في كلامه الاخير هل تقصد بان تلك الطريقة لا تنفع الا مع ريجيسترات معينة وهي التي ذكرتها انت si di bp bx ؟ ام انها في حالة الديبق فقط؟ وما هل تقصد عن استعمال الاسمبلير تكون االعملية عادية؟ وانت ذكرت اسمبلير 32 فما بال اسمبلير 16 هل مثله ؟؟؟ وهل الريجيستر sp لا ينفع بالطريقة السابقة؟؟؟

#13

النمط يلي عم تحكي عنه هو نمط العنونة الفهرسية على ما أعتقد

Index Addressing Mode

يتم إستخدام المسجلات التالية

SI DI BP

و لتعزيز العنونة يستخدم المسجل

BX

#14

يعني ال Index Addressing Mode لا ينفع الا مع SI DI BP Bx فقط او ذلك في حالة استخدام الديبق ام في الاسمبلير فانه لايفرق ؟؟؟؟؟ ارجو التوضيح

عندي سؤال عن interrupt لما عند تنفيذ الرجوع الي الدوس وطلب خدمة DOS int 20H لابد من المرور بخطوات مثل

mov ah,4ch
int 21h

لماذا لا تنفذ int 21h مباشرتا دون تحميل الريجستر ah ؟؟؟؟

ما هي استخدامات الريجيسترات الاتية وبالاخص bs الذي لم الجظ له اي تأثير في الديبق SI DI BP

#15

السلام عليكم,

اقتباس
يعني ال Index Addressing Mode لا ينفع الا مع SI DI BP Bx فقط او ذلك في حالة استخدام الديبق ام في الاسمبلير فانه لايفرق ؟؟؟؟؟ ارجو التوضيح

لو تجربها حتى في كمبايلر آخر تعطيك خطء إذا لم تستعمل هذه الرجسترات.

اقتباس
لماذا لا تنفذ int 21h مباشرتا دون تحميل الريجستر ah ؟؟؟؟

لا يمكنك استدعاء المقاطعة لوحدها. بما أنها تحتوي على عدة دوال كل واحدة برقم فحين نستدعي المقاطعة 21 يجب أن نحدد الدالة التي نريد وهي معرفة برقم يجب وضعه في الرجستر ah ولهذا يجب إعطاء شيء للرجستر قبل أن نستدعي المقاطعة.

ماذا تقصد ب bs فهذا ليس رجستر.

الرجسترات SI DI BP قد نستعملها في عدة عمليات فمثلا SI DI تستعمل بكثرة فيما يخص بمقارنة أو نقل أو تحويل مكان ما في الذاكرة والرجستر SI يدل عل Source أو المنطلق بينما DI أو Destination يكون هو الهدف. فمثلا لو نريد أن ننقل 100 بايت من المكان 1 إلى المكان 2 ما علينا سوى أن نضع في الرجستر cx عدد الذي نريد نقله مثلا هنا 100 ونضع في الرجستر SI عنوان المكان الأول وفي DI عنوان المكان الثاني والتعليمة movsb تقوم أوتوماتيكيا باللازم.

إلى اللقاء.

#16

على ما أعتقد أنت تقرأ من دار شعاع

لذلك تمهل لأنه كل أسئلتك هذه مجاوب عليها

في فصول قادمة و حتى أنا تعذبت و ما زلت أتعذب في فهم

هذه المصطلحات >>>>

مع الصبر و قوة العزيمة تستطيع قراءة الكتاب !

#17

شكرا علي تعاونك

انا فهمت من كلامك ان interrupt رقم يشير لجدول به عدة ارقام وكل رقم يختص بوظيفة معينة

مثل ما فهمت ان int 21h يحتوي علي عدة خدمات مرقمة وكل خدمة لها وظيفة ويتم طلبه بالرقم وتحميله الي الرجيستر

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

سؤال آخر لماذا ال ah بالذات او هل ليس بالضروري استخدام ال ah في تحديد رقم الخدمة التابعة لانترابت؟

هل من الممكن استخدام ريجستر آخر عوضا عن ال ah مثل ال bh ؟

اقتباس
الرجسترات SI DI BP قد نستعملها في عدة عمليات فمثلا SI DI تستعمل بكثرة فيما يخص بمقارنة أو نقل أو تحويل مكان ما في الذاكرة والرجستر SI يدل عل Source أو المنطلق بينما DI أو Destination يكون هو الهدف. فمثلا لو نريد أن ننقل 100 بايت من المكان 1 إلى المكان 2 ما علينا سوى أن نضع في الرجستر cx عدد الذي نريد نقله مثلا هنا 100 ونضع في الرجستر SI عنوان المكان الأول وفي DI عنوان المكان الثاني والتعليمة movsb تقوم أوتوماتيكيا باللازم

انت ذكرت ان كل من SI DI في مثالك ولكن قد نستطيع ان نعمل تلك الحركة باستخدام الريجيسترات مثلا bx,dx اي نضع عنوان المصدر في احد منهم وعنوان الهدف في الاخر ؟

#18

بالفعل انا اقرأ من هذا الكتاب لانو المصدر الوحيد لدي والمشكلة انو باللغة العربية لو كانا باللغة الانجليزية كان احسن والمشكلة ان المنتدي هو البوابة الوحيدة لدي لان ليس لدي من يعرف هذه اللغة حولي

#19

السلام عليكم,

حين تبرمج دالة عادية ستقوم بتحديد وضائفها وتحديد البارامترات التي يخصها إلى غير ذالك. وكذلك المقاطعات فقبل أن نستعمل أي مقاطعة يجب أن نعرف كيف تعمل وما تطلبه منا قبل أن تبدأ عملها وكذلك يجب أن نعرف ماذا سترجع لنا وأين ترجع لنا المعلومات. فهذه قواعد وضعها المصمم الأول ولهذا إذا كنا سنستعملها يجب أن نحترم كل هذه النقاط فهي كما هي وما علينا سوى الخضوع. يمكن دائما أن نغير ما نريد تغييره ولكن هذا يدخل في سياق آخر. ولنعلم أن المقاطعة 21 وحدها تضم تقريبا كل الدوس فهي بالضرورة إذن تحتوي على عدة وضائف مختلفة والرجستر ah هو الذي سيحدد كل وضيفة.

وتساؤلك لماذا الرجستر ah وحتى لو استبدلناه بالرجستر bh كما قلت يمكن دائما لأحد آخر أن يتساءل لماذا bh وليس ah .المهم أنا كمستعمل يجب أن أعرف شروط الإستعمال ووضيفة كل رجستر عند استدعاء المقاطعات.

عن تساؤلك الأخير أنا أعطيت مثالا عن الرجسترات SI DI وحين نريد نقل مكان ما في الذاكرة إلى مكان آخر يمكن أن نستعمل طريقتنا واستعمال رجسترات أخرى إذا أردنا. ولكن إذا أردنا استعمال تعليمات البروسسور الخاصة بذلك وهي كل ما يتعلق بالسترينغ - أو الذاكرة - فعندنا تعليمات متعددة مثل ما ذكرت movs بمختلف أنواعها أو scas وغيرها وهنا يتحتم علينا استعمال الرجسترات السابقة فهذه التعليمات مرتبطة بهذه الرجسترات ولا تعمل إلا معها وإلا ستحصل على نتائج غير متوقعة.

إلى اللقاء.

#20

بما تنصحوني كمبتدأ ان استخدم الديبق ام الاسمبلير؟؟؟؟

هل برنامج الديبق يكون ملفات بامتداد exe ؟ ام هو مخصص ل com فقط ؟؟؟؟؟

#21

السلام عليكم,

الأخ فارس إن برنامج الديبوغ كما يدل على ذلك اسمه فهو وضع لغرض معين وأضن أن شغله الأساسي هو عمل ديبوغ لمختلف لبرامج وكما في أي ديبوغ محترم يمكننا من كتابة كود بالأسمبلر وذلك إذا ما كانت هناك أخطاء ونريد تغييرها ولهذا فالكود الذي نكتبه بهذا سيكون جد محدود.

ولهذا أنصح أنه إذا أردنا فعلا البرمجة بالأسمبلر أن نتوجه نحو الكمبايلر علما أن البرمجة هنا تكون أسهل من البرمجة تحت الديبوغر.

إلى اللقاء.

#22

ممكن تعطني مثال بسيط اجربه علي الديبقر اذا كان الديبق لا ينفذ الا 16 بت اريد تنفيذ برنامج خاص ب 32 بت علي ديبق الدوس لاعرف الفرق؟؟

يعني ان الديبق مصمم لان يترجم تعليمات الاسمبلي علي بئية كمبوترات 16 بت؟؟؟

#23

السلام عليكم,

إن برنامج debug الذي يأتي مع الوندوز لا يمكن أن يعمل ديبوغ لبرامج من 32 بت وهو أصلا لا يعترف بالرجسترات 32 بت. فعلى سبيل المثال قم بالتعليمة البسيطة التالية :

mov eax,1

فسترى أنه لن يعترف بها ونعلم أن الرجستر eax هو امتداد 32 بت للرجستر ax من 16 بت.

وكذلك قم بعملية ديبوغ لبرنامج من 32 بت كالنوتباد مثلا وسترى أن كل ما سيعطيك برنامج الديبوغ هو القسط الخاص بالدوس ويعني الرسالة أن البرنامج لا يشتغل تحت نظام الدوس.

إلى اللقاء.

#24

لما ملفات ال exe تولد مقطع psp ؟ وما فائدتها وهلي تحتوي علي معلومات مهمة خاصة يفهما البروسيسور ؟؟؟

كذلك عرفت بان ملفات com تولد ذلك المقطع وطوله 100 بايت هل لهذا الغرض عند عمل برنامج بالديبق لملف com لابد من البدياة من العنوان 100 ام هو ليس بشرط يعني قد ابدا من الازاحة 10 مثلا ؟؟؟؟

#25

السلام عليكم,

إن برامج com دائما تبتدأ من العنوان 100 ونعلم أن الفرق بينها وبين برنامج exe قد يكون أساسا في طول البرنامج. فبرنامج الكوم يجب أن لا يكون فيه أكثر من سكمنت فهنا لا نخرج عن نطاق السكمنت ويمكن أن نقول أن طوله لا يتعدى FFFF بينما برنامج exe يمكن أن يعمل على عدة سكمنت وبهدا لا يكون له طول محدد.

إلى اللقاء.

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

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