ولكن لم تبين لي الغرض من المقطع الذي ينشئه الدوس والذي هو psp
سؤال بسيط في الاسمبلي عن ال stack
السلام عليكم,
إن مقطع PSP هو عبارة عن معطيات تتكون من 100 بايت هيكس وهي تسبق البرنامج وهي تعطيه بعض المعطيات والتفاصيل التي يمكن أن يحتاجها. هي ليست على بالي بالتفصيل إنما تضم عناوين بعض المقاطعات وخاصة المقاطعات التي تمكن من تغيير عناوين المقاطعات في حالة ما إذا كان برنامج الأب أو البرنامج الذي استدعى هذا البرنامج قام بتغيير شيء ما. كما تتضمن عنوان البرنامج الأب كما تتضمن آخر السكمنت الممنوح للبرنامج وكذلك عنوان فيه الهاندلات المفتوحة وهكذا معطيات لا أتذكرها كلها ولا ما هو ترتيبها وإنما هي على هذا الشكل. ويمكن أن تبحث عن ملف يعطيك شكل هذا المقطع حتى تتعرف بالتفصيل عن كل بايت فيه وإذا لم تعثر عليه يمكن أن أضعه هنا لأنه يمكن أن يوجد عندي في مكان ما.
إلى اللقاء.
هل يعتبر ال interrupt كأنه روتين بحد ذاته او دالة نستدعيها بالرقم او ال call الخاصة بها؟؟؟
يعني ان المايكروبروسيسور يخزن في ذاكرته مجموعة أجراءات معينة لوظيفة معينة وهي جاهزة دون عمل اجراء من عندنا أطلق عليها اسم انترابت؟
السلام عليكم,
هذا سؤال حقيقة قد نطرحه على أنفسنا في بداية الأمر والجواب بسيط حين نفهم القصة.
أولا أريد أن أتكلم عن معنى التسمية interrupt والتي نترجمها بالمقاطعة أة القطع وهنا أعطي مثال. لنفرض أننا شغالين في برنامج ما وفي نفس الوقت يجب أن نرى إذا ما كان هناك ضغط على زر من الأزرار. فهنا الفكرة البرمجية التي قد نفكر فيها في الأول هي أن نعمل قطعة كود تحاول أن ترى في كل وقت - كل ثانية أو جزء من الثانية - هل هناك ضغط ما وهذه الطريقة فعلا تبدو لنا ثقيلة شيء ما لأن تقريبا كل وقت شغل البرنامج سيذهب في البحث عن الضغط. ولهذا فكر المبرمجون والمصنعون أن يكون للبروسسور مساعدون . فبدل أن نذهب كل مرة نراقب الكايبورد فهذا الأخير يعطينا هو نفسه إنذار إذا ما وقع ضغط عليه وهذا الإنذار يكون على شكل مقاطعة . والبرنامج الذي يكون شغالا سوف لا يهتم بالكايبورد ولكن حين يرسل هذا الأخير مقاطعة فإن البروسسور يوقف أو يقطع البرنامج يعالج المقاطعة المرسولة وحين ينتهي يرجع ثانية ليتمم البرنامج وهكذا. وهذه الطريقة ستمكننا من ربح وقت قيم . ولهذا سميت بالمقاطعة لأنها تقطع البرنامج الشغال. هذا فيما يخص التسمية.
الآن هل نعتبر المقاطعة دالة أم شيء آخر. هي في الحقيقة ليست إلا دالة كباقي الدوال ونعلم أننا يمكن تغيير عمل مقاطعة ما بكتابة كود جديد وهذا يدل أيضا أنها ليست شيء خارق .وقد يكون الفرق في كيفية الرجوع من الدالة لأن عند استدعاء مقاطعة فإن رجستر الفلاغ يوضع هو أيضا في الستاك فإذا أخذنا هذا بعين الإعتبار فلا فرق يذكر . والسؤال الذي قد نطرحه فإذا كانت دالة عادية فلمذا نستدعيها بأرقام. هذا فقط لغرض عملي علما أنه يمكن أن نستدعيها بعنوانها. وهنا يجب أن نعرف ماذا يقع حين نستدعي مقاطعة رقم س . في بداية الذاكرة توجد هناك ما يسما ب Interrupt Vector وهي عناوين للمقاطعات وكما ذكرت مسبقا حين نستدعي المقاطعة س سنذهب إلى الذاكرة رقم س*4 ونأخذ من هناك عنوان هذه المقاطعة وبعد هذا نذهب إلى هذا العنوان وننجز الكود اللي هناك كأننا داخل دالة عادية. وهنا يطرح السؤال أيضا لمذا كل هذا التعقيد لإستدعاء مقاطعة ولم لا نستدعي المقاطعات مباشرة كل واحدة بعنوانها. والجواب هنا لغرض عملي كما ذكرت ولنفرض مثلا أننا نريد أن نغير عمل مقاطعة للبيوس. بما أن البيوس هو في الروم ولا يمكن أن نكتب أو نغير شيءا ما هناك فالطريقة ستكون سهلة بهذه التقنية إذ يكفي أن نكتب الكود الجديد للمقاطعة التي نريد أن نغيرها ونذهب إلى Interrupt Vector ونغير عنوان المقاطعة التي نريد ونضع هناك عنوان دالتنا الجديدة . هنا قد وضعنا تغيير بسيط ولكن بالنسبة لكل البرامج فقد وقع تغيير لمقاطعة ما والكل يسير كأن شيء لم يكن وهنا سيبدو لنا كأنه عندنا دالة جديدة للبيوس.
أتمنى أي يكون هذا مفهوم وإلى اللقاء.
1- ما فائدة الريجيستر bp ؟ لاحظت من الديبق انه يشير الي اول ازاحة في ال stack عند الازحة صفر ولا يتغير به اي شي بخلاف sp الذي يتغير علي حسب تعليمة ال push و ال pop
هل فائدته كمسجل دليلي فقط يعني استخرج ما يشير اليه ال sp من قيمة فقط؟؟؟
2- اسمع ولا اردي ما سمعت بصحيح ان بعض الريجيسترات العامة مثل ax عند استخدامها مع شفرات اسمبلي في اجراء عملية ما قد تكون اسرع من ريجسترات اخري تؤدي نفس المهمة فهل راجع ذلك الي ان البروسيسور يولد شفرة لتعلمية ما مع رجيستير معين اسرع من ريجستر اخر بنفس التعليمة؟
3- اين تخزن جميع شفرات الاسملي في البروسيسور مثل تعليمة mov وغيرها كي يفهم البروسيسور تعلمية صحيحة من اخري غير صحيحة ؟ هل يقارن البروسيور كل تعلمية يجلبها من الرام للتنفيذ بسجل من التعليمات المخزنة فيه كي يبين ان كانت من ضمن السجل المخزن به التعلميات ام ماذا؟؟
السلام عليكم,
الرجستر BP يمكن أن نقول أنه كباقي الرجسترات فأنت كمبرمج يمكن أن تستعمله في عدة حالات. ولكن في أغلب الأحيان قد نستعمله لتخزين الرجستر SP وكذلك حين نستدعي دالة ما بتمرير البارامترات عبر الستاك قد نستعمل هذا الرجستر داخل الدالة ليشير إلى البارامترات التي نكون مررناها إليها.
فيما يخص سرعة العمليات يمكن أن تلقي نظرة على ملف للمعالج الذي تريده ويكون فيه مختلف التعليمات وكذلك سرعة كل تعليمة بعدد cycles وستشاهد سرعة كل عملية. فمثلا لو نريد أن نضع 0 في رجستر ما مثلا ax فيمكن أن نقوم بما يلي :
mov ax,0 وهذا طبعا صحيح كما يمكن أن نقوم بالعملية xor ax,ax وهذان العمليتان يعطينا نفس النتيجة ولكن إذا كنا مهتمين بالسرعة فالتعليمة الثانية أسرع من الأولى.
إن البروسسور لا يفهم معنى mov أو غيرها وإنما الذي يقوم بهذا الدور هو الكمبايلر. ونعلم أن لكل تعليمة لها رقم خاص بها فهناك تعليمات لها رقم من نوع byte وأخرى من نوع وورد وغيرها كما أن كل تعليمة يلزمها عدد معين من المعطيات منها من لا يلزمها شيء ومنها من يلزمها بايت وهكذا. فمثلا حين نكتب mov ax,6 فإن الكمبايلر سيحولها إلى الكود أو الأرقام التالية m
8B 06 00
والبروسسور حين يقوم بعمله ويأتي إلى هذه الأرقام سيعرف أن العدد 8B يأمره بتحميل الوورد الموالي في الرجستر ax ويعرف أن هذه العملية تتطلب منه 3 بايتات لذى سيقوم بتحميل العدد 0006 في الرجستر ويزيد 3 إلى الرجستر ip ليعالج الأمر الموالي وهكذا.
وعلى سبيل المثال ليس هناك فرق بين التعليمة والمعطيات إلا في موقعهما وعلى سبيل المثال نفترض أنه عندنا الكود التالي :
mov ax,B8
والكود لهذا سيكون هو
8B 8B 00
وهنا نرى أن 8b الأولى هي تعليمة بينما الثانية هي معطيات ولكن لو نغير قيمة ip هنا ونزيد له 1 فستصبح 8b الثانية تعليمة وسيقوم بتحميل الوورد الموالي في الرجستر axوهكذا
إلى اللقاء.
بما ان ال flag registers عددهم 9 ولكن اين منهم يمكن التغيير فيه برمجيا والتحكم به من قبل المبرمج واين منهم لايمكن التدخل في التغيير فيه ومهمته مرتبطه بالمعالج فقط؟
السلام عليكم,
مبدئيا إذا صح القول يمكن أن نغير أي شيء في الفلاغ ولكن يجب أيضا أن نراعي عواقب ما نغير .
عمليا ما علينا سوى أن ندفع رجستر الفلاغ إلى الستاك ونأخذه إلى الرجستر ax نقوم بتغيير ما نريد في هذا الرجستر وندفعه إلى الستاك ثم نأخذ الفلاغ من الستاك وهاو عندنا فلاغ جديد :
pushf pop ax change what you want in ax push ax popf
إلى اللقاء.
ولكن سمعت انه هناك بعض ال flag لا يكمن التغيير في حالتها وهي تتغير من قبل النظام وان هناك بعض ال flag مصرح لنا التدخل في تغيير حالتها . فهل هذا صحيح؟؟؟؟؟؟؟
السلام عليكم,
كما ذكرت هناك 9 فلاغات والرجستر هو من 16 بت والسبعة الباقية غير مستعملة على الأقل في 8088 وهذه مبدئيا لا يمكن أن نقرأها أو نغيرها على الأقل هذا ما تقوله الشركة أما التسعة المستعملون فيمكن أن نغير ما نريد فيهم ولكن لا جدوى أن نغير هكذا بدون سبب فمثلا لو نغير فلاغ المقاطعات فقد يبقى برنامج ما بدون مقاطعات ولو نغير فلاغ Direction فقد نغير شغل برنامج ما ولو نغير فلاغ Trap هذا قد يعطينا خطء في الإنجاز إذا لم نكن نستعمل ديبوغر ما.
وهنا سأعطي دليلا على هذا وكما سبق يمكن أن نقوم بالبرنامج التالي :
pushf pop ax not ax push ax popf
كما قلت مسبقا سنقوم بدفع الفلاغ في الستاك ثم نأخذه في رجسر ax نقوم بالأمر not ax وهذا سيقوم بتغيير كل بت إلى عكسه وهنا نكون قد غيرنا كل البتات ثم نرجع هذا إلى الفلاغ ومبدئيا هنا نكون قد غيرنا كل الفلاغات.
وهنا أنصح أن نستعمل هذا الكود داخل ديبوغر وحتى نتمكن من رصد خطء Trace الذي قد يرسل إلينا بعد تغيير الفلاغ الخاص به. كما يمكن أن نجرب هذا في مختلف الحالات حتى نعرف أكثر كيف تجري الأمور وفي أسوء الحالات ما علينا سوى أن نعيد تشغيل الجهاز.
إلى اللقاء.
هذا الموضوع مغلق.