به شكل بالا نگاه كنيد. ابتدا با r من ليست رجيسترها را گرفته ام. و مي بينيد كه ax و bx هر دو صفرند.
بعد با دستور a و اينتر ، آماده نوشتن كدها شده ام. 3 خط دستور نوشته ام و بعد در خط چهارم ، اينتر كرده ام تا از ((حالت دستور نويسي)) خارج شوم. بعد 3 بار حرف t را زده ام. T كارش اين است كه هر بار يك خط از دستورات ما را اجرا مي كند.
بعد t اول مي بينيد كه ax تغيير كرده. چون دستور mov باعث شده كه عدد 1111 به ax نسبت داده شود.
بعد t دوم مي بينيد كه bx تغيير كرده. به دليل قبلي.
بعد t سوم مي بينيد كه ax تغيير كرده . چون كه add باعث شده كه ax و bx جمع بشوند و در ax قرار بگيرند.
== == == == === == == === === === === === ===
البته من برنامه بالا را براي سرگرمي نوشتم. چون قراره كه ما محاسبات را در سي انجام بدهيم و براي چنين كارهايي به سراغ اسمبلي نرويم.
== == == == == == == == == == == === === ====
در شكل بالا ، چهار بار ليست رجيسترها به نمايش درآمده. اولي قبل اجراي هيچ دستوري و 3 بار بعد بعد اجراي دستورات ما.
به ip دقت كنيد. از 100 تا 108 تغيير كرده. و موقعي كه داشتيم دستور مي نوشتيم به آن اعداد قبل دستور نگاه كنيد. آنها هم مشابه ip تغيير كرده اند.
نتيجه گيري: ip آدرس جايي است كه دستور آماده اجرا آنجا در Ram نشسته. كنترل cpu به ip منتقل مي شود و آن دستور را اجرا مي كند.
پس در استفاده از حرف t دقت كنيد. چون اين دستور باعث ميشود كه كنترل برود دستور نشسته در آدرس ip را اجرا كند. پس بايد قبل استفاده از اين دستور ip را خودتان به شكل دستي تنظيم كنيد.
در تمرينات بالا من تنظيم نكرده ام . چون مي دانستم كه بعد هر t خودبه خود ip به دستور بعدي نشانه مي رود و من هم همين را مي خواستم . يعني مي خواستم بعد اجراي هر دستور ، دستور بعدي اجرا شود.
و حالا اگر بخواهم كار را تكرار كنم اول بايد دوباره ip را 100 كنم. براي اينكار
کد:
-r ip ((inter))
ip 0100
: [color=red]_[/color]
طبق كد بالا اول ip را نوشته و اينتر مي كنيم. كه ابتدا ip فعلي را گزارش مي كند و جايي كه با خط قرمز نشان دادم ، كرزر چشمك مي زند و آماده وارد كردن مقدار جديد است كه مقدار جديد را وارد مي كنيم و اينتر مي كنيم.
بگذريم.
در شكل بالا اول با r يك ليست گرفتيم. بعد با a باز وارد دستور نويسي شده ايم.
ولي اين بار بجاي t از حرف g استفاده كرديم.
تفاوتهاي t و g :
اولي يعني t فقط يك دستور را اجرا مي كند و متوقف مي شود و نتيجه را با نشان دادن رجيسترها در معرض ديد قرار مي دهد ولي دومي يعني g ، تا دستور خاتمه (كه در اينجا int 20 است) به اجراي متوالي دستورات ادامه مي دهد.
اولي هر تغييري در رجيسترها ايجاد شود را ره حالت اول برنمي گرداند ولي دومي بعد اينكه كارش تمام شد ، تمام رجيسترها (من جمله ip ) را به حالت قبلي در مي آورد.
حالا خودتان قضاوت كنيد كه هر يك به چه كاري ميايد.
= == = == == = == = == = == == == == ==
حالا شرح دستورات :
ما آمده ايم ah را 2 كرده ايم . و dl را 41 .
و بعد وقفه 21 را صدا زده ايم. وقفه 21 كه كار نداريم وقفه dos است يا bios ، هزار تا كار انجام مي دهد و چه طوري بهش بگيم الان كدام كارت را انجام بده؟؟
جواب : با تنظيم ah . با تغيير ah مي گوييم داريم از سرويسهاي فلان وقفه استفاده مي كنم. و اينجا داريم از سرويس 2 وقفه 21 استفاده مي كنيم. و اينجا كارش اينه كه dl را كد يك حرف در نظر مي گيره و آن را چاپ مي كند كه 41 همان كد حرف A است.
براي خروج هم از وقفه int 20 استفاده كرده ايم. كه اين وقفه كارش اينه كه كنترل را از برنامه ما مي گيره و به dos برمي گرداند و يكسري كارها هم انجام مي دهد كه حالا در سطح من نيست بگم.
خوب يك برنامه 4 خطي نوشتيم. حالا همين برنامه مي تواند تبديل به يك فايل com بشه و يادگاري براي خود نگه داريم تا هر وقت روي اين فايل كليك كنيم ، يك حرف a براي ما چاپ كنه. البته ضرورتي نداره كه اين كار را ياد بگيريم ولي براي سرگرمي من روش اين كار را مي گويم.
اول بايد اسمي به فايل بدهيد. كه بايد با پسوند بگيد. كه com است
بعد بايد حساب كنيد كه حجم فايل شما چقدر است و در cx قرار بدهيد(اگر بزرگ بود ، ادامه اش در bx ) . در شكل بالا جايي كه اينتر كرديم و از دستورنويسي خارج شديم ، نگاه كنيد ، ip مساوي 108 است . يعني ما از 100 شروع كرده ايم و تا 108 كد نوشته ايم . پس 8 ميشه حجم فايل ما . پس cx را مساوي 8 كنيد. با همان دستور قr . همون جور كه ip را تنظيم كرديد.
مي رسيم به مرحله آخر كار كه save است. البته بايد قبلش اسم داده باشيد و حجم فايل را تعيين كرده باشيد. براي save ، كافيه حرف w را بزنيد و اينتر كنيد.
در شكل زير همين مراحل را من انجام داده ام.
فايل شما روي desktop منتظر شماست. و حجمش 8 بايته.
شايد اين كوچكترين برنامه اي باشه كه مي شد ساخت كه كاري انجام مي دهد!!
اين تمرينات ساده را كرديم تا فقط با رجيسترها و مقدار دهي به آنها مانوس بشه ذهنمان و كار با وقفه.
دليلي به انجام اين تمرينات از سوي شما نيست. فقط مي خواستم بدانيد كه رجيسترها چه هستند و وقفه چه طوري احضار ميشه.
در تاپيك اصلي هم از وقفه 33 براي روشن كردن ماوس استفاده كرديم ولي با استيل سي نه با استيل اسمبلي.
يك هدف من از نوشتن اينها اينه كه يكسري رجيستر خاص را بعدا مي خواهم بكار ببرم كه كارهاي خاصي انجام مي دهند.
به اسامي رجيسترها نگاه كنيد. يكسري با حرف s ختم مي شوند شامل cs و ds و ss و es . اينها مربوط به آدرس قطعه ها هستند. مثلا cs:ip ميشه آدرسي كه كنترل به آنجا ميره براي اجراي دستور آنجا. مثل آدرس خيابان و كوچه است. Ip ميشه كوچه و cs خيابان.
قطعه پشته هم با ss و sp معين ميشه. دقيقا مثل cs:ip . داريم ss:sp . كه sp ميشه stack pointer كه فكر كنم نشان مي دهد تا كجا پشته پر شده. كه فعلا چون كتاب جلوم نيست مطمئن نيستم. bp هم شايد با پشته مربوط باشه. فعلا قسمتهايي كه راجع به ادرسهاي پشته گفته شد را با شك بخوانيد تا بعدا بيام اصلاح كنم. ولي بعدا اگر لازم شد درست تر و كامل تر بحث مي كنيم.
اين كه مي گم اگر لازم شد به اين خاطره كه تا آنجايي كه ميشه ، من مي خواهم از دستورات اسمبلي در تاپيك اصلي استفاده نكنم و اگر كار در محيط اسمبلي كمك كننده بود ، آنگاه به اين سمت(اسمبلي) متمايل مي شوم. پس اگر با دستورات سي ، بشه پشته را آموزش داد و استفاده كرد ، سراغ اسمبلي نمي آيم و آنوقت اين تاپيك فقط جهت يك آشنايي و سرگرمي مطرح است.
راجع به si و di هم كاربرد خوبي داره براي نوشتن و خواندن در Ram . كه با ds و es تركيبي كار مي كنند. يعني قضيه كوچه و خيابان ، هميشه براي Ram مطرحه.
اين پست شد اولين آشنايي با اسامي و كار رجيسترها.
بقيه بماند براي پستهاي بعدي.
.
====================================
ديباگ قادر است كه فايل com شما را دوباره بخواند. به محيط ms dos prompt برويد و به جايي كه فايل com شما قرار دارد برويد و مثل شكل زير اقدام كنيد. حرف u ليست دستورات را مي دهد كه مي بينيد همان دستوراتي است كه شما نوشته ايد.
.