با سلام.
مي دانيد كه رجيسترها يا
Ram
حافظه هايي هستند كه از بيت و بايت تشكيل شده اند.
مثلا رجيستر
ax
دو بايت است.
در داخل اين بايتها يكسري صفر و يك قرار دارد كه ما براي راحتي در مبناي 16 قرائت مي كنيم.
ولي چه در
Ram
و چه در رجيسترها ، ما لازم است با حروف هم كار كنيم. مثلا اسم خود را در حافظه ذخيره كنيم.
اولا به طور كلي مي شود رجيسترها را بندرگاههاي
cpu
ناميد. يعني محموله ها و بارها موقع ورود و خروج به
cpu
در رجيسترها قرار مي گيرند.
ولي محل اصلي قرار گيري اطلاعات روي
Ram
است.
يعني
cpu
اطلاعات را از
Ram
برمي دارد و داخل رجيسترها قرار مي دهد و روي آنها كار مي كند و در جاي مناسب در محل ديگري از
Ram
قرار مي دهد.
رجيسترها را مي شود دستهاي
cpu
دانست . ولي بايد
cpu
را در اين تشبيه صاحب دستهاي بيشتري دانست.
ما در محيط ديباگ بالاي 10 رجيستر را ديديم ولي بيش از اين هاست .
حال پس ديگه راجع به رجيسترها حرف نمي زنيم. چون آنها محلهاي ورود و خروج هستند و راجع به اطلاعات موجود در
Ram
حالا حرف مي زنيم.
در فايلهاي
com
گفتيم كه دستورهايي كه ما مي نويسيم تا اجرا بشه ، از آدرس 100 بايد وارد شود. البته اين 100 مي دانيد كه در مبناي 16 است و در مبناي 10 ميشه 256 .
در اين 256 آدرس چه چيزهايي قرار دارد؟
جواب اينكه چيزهاي مختلفي هست ولي يك قسمت اعظم آن به عنوان (( قسمت نگهداري داده ها)) نگهداري ميشه. فرض كنيد بخواهيد به كاربر بگوييد
. Ok. Thank you.
، براي اينكار اين جمله را ميشه در اين قسمت نگهداري كرد.
بهتره حالا بحث را كمي گسترده كنيم.
ما بايد 3 قسمت مهم را در هم
com
و هم
exe
نام بريم.
اول – قسمت دستورات
دوم – قسمت پشته
سوم – قسمت داده
در فايلهاي
com
هر سه قسمت در يك قطعه قرار دارد. همين جا گفتيم كه آن 256 بايت براي نگهداري داده ها بود. قسمت پشته در فايلهاي
com
هم از انتهاي قطعه به سمت پايين پر مي شود. و قسمت دستورات هم كه از آدرس 100 شروع مي شد.
اما در فايلهاي
exe
، قطعات جدا از هم براي اين سه قسمت در نظر گرفته شده. البته وابسته به مدلهاي انتخاب شده توسط ما هم دارد. در برنامه هايي كه من براي اسمبلر نوشتم ، ديديد كه
model small
نوشتم. در اين مدل دو تا از قطعه ها مثلا روي هم قرار دارند. يعني اشتراكي از يك قطعه استفاده مي كنند. من چون برنامه هاي ما آموزشي بود ، نيازي به تعريف برنامه هاي
large
و غيره نداشتم.
ماهيت بايتها:
حال كه فهميديم در
Ram
ميشه چيزهاي مختلفي نگهداشت ، به ماهيت بايتها مي پردازيم.
اول – دستور
دوم – داده ،،،،،، كه خود داده مي تواند عدد يا حرف(كاراكتر) باشد.
به شكل زير نگاه كنيد.
در سمت راست دستورات را به شكل قابل فهم تري براي انسان مي بينم ولي در سمت چپ به همان ترتيب كه در
Ram
نشسته اند. مي بينيد كه اعداد همان ها هستند و همچنين دستورات هم به شكل اعداد(مبناي 16) نمايش داده شده اند.
البته يك بيت از لحاظ سخت افزاري چيزي بيش از يك چراغ روشن يا خاموش نيست ، و اين ما هستيم كه چند تاي آنها را يك عدد (حالا به هر مبنايي ) فرض مي كنيم.
حالا از حالا فرض مي كنيم كه
Ram
پر از اعداد است.
بعضي از اين اعداد را
cpu
دستور فرض مي كند. اگر شما با دستور
jmp 700
كنترل
cpu
را به اين منطقه بياندازيد ، هر عددي آنجا باشد را
cpu
براي خود به دستوري تفسير كرده و همين طوري مي رود جلو و همه اعداد را دستور فرض مي كند. و يا با اجراهاي نامناسب كامپيوتر از كار مي افتد و يا اينكه جايي به شكل تصادفي اين اعداد دستور اختتام را به
cpu
مي دهند و كار فيصله مي يابد.
اما كجا
، cpu
عددي را واقعا عدد مي خواند؟ جواب با دستور قبلي. در شكل بالا چون
cpu
با دستور
add
مواجه شده مي فهمد كه بايد بايت هاي بعدي را عدد فرض كند و عدد بخواند. چون مي داند كه يك عدد بايد
add
بشود و
add
خالي معني ندارد.
در مورد كاراكتر هم همين طور است. با دستورات است كه
cpu
مي فهمد بايد برود اعدادي را كاراكتر فرض كند و آنها را به شكل حروف الفبا براي خود تفسير كند.
جدول اسكي:
اينجاست كه جدول اسكي معني پيدا مي كند. يعني ما بايد طبق جداولي اعداد را به كاراكترها نسبت دهيم . مثلا 41 (در مبناي 16) را مساوي حرف
a
بگيريم.
اين جدول در انتهاي تمام كتابهاي اسمبلي و سي و بقيه زبانها هست و استاندارد است. و در اينترنت هم با يك سرچ كوچك پيدا ميشه.
حالا فرض كنيد كه در رجيسري عدد 3 وجود دارد. و ما مي خواهيم دستوري بنويسيم كه محتواي اين رجيستر را چاپ كند بر روي صفحه.
اگر در
Ram
در خانه اي عدد 33 ذخيره شده باشد و ما به
cpu
بگوييم برو آن را كاراكتر فرض كن ،
cpu
آن را كاراكتر 3 مي داند. و اگر بخواهيم چاپش كند هم 3 را روي صفحه مونيتور چاپ مي كند.
حالا كه ما مي خواهيم محتواي رجيستر ما كه 3 است ،، به شكل 3 روي صفحه چاپ بشود بايد به
cpu
33 (در مبناي 16) بدهيم. پس مي آييم 30 تا به آن اضافه مي كنيم. (30 در مبناي 16 ميشه 48 در مبناي 10)
حال فرض كنيد در رجيستري
a
باشد. (يعني همان 10 در مبناي ده) ، موقعي كامپيوتر حرف
a
را بر صفحه نمايش چاپ مي كند كه عدد 41 را به آن بدهيم . يعني بايد 31 تا(در مبناي 16) بهش اضافه كنيم تا اين حرف
(a)
چاپ شود.