آموزش اسمبلی بخش 3
کد گذاری ASCII(American Standard Code for Information Interchange) به حروف، ارقام، علائم و کاراکترهای مختلف يک عدد باينری 7 بيتی نسبت می دهد و هشتمين بيت را 0 درنظر می گيرد. به اين صورت هر کاراکتر يک بايت را اشغال می کند.
روشن است که اين روش برای نمايش اعداد مناسب نيست، چون در فرمت باينری يک بايت اعداد 0 تا 255 را نمايش می دهد، اما با کد ASCII يک بايت تنها برای نمايش يک رقم کافی است. به همين دليل کلا اين روش برای نمايش متن در حافظه استفاده می شود.
مثال. نمايش عدد 123 با دو فرمت ASCII و باينری
نوع توسعه يافته اين سيستم شامل 8 بيت برای هر کاراکتر است و 256 حالت مختلف را شامل می شود. کدهای 0 تا 127 برای کاراکترهای استاندارد، کدهای کنترلی و ارتباطی و مقادير 128 تا 255 برای نمايش سمبل های گرافيکی و حروف يونانی هستند.
مثال. رشته "ABC123" به صورت 41h 42h 43h 30h 31h 32h نشان داده می شود.
يک کدگذاری کامل تر که جای ASCII را دارد می گيرد Unicode است. تفاوت کليدی بين اين دو نوع کدگذاری در اين است که ASCII يک بايت را برای کدکردن يک کاراکتر استفاده می کند در حاليکه Unicode برای هر کاراکتر دو بايت را درنظر می گيرد. بنابراين کاراکترهای بيشتری را می تواند نمايش دهد که اين برای نمايش کاراکترهای کليه زبان های دنيا کاربردی است.
مثال. کدگذاری ASCII کد 41h يا 65 را به کاراکتر A می دهد. کدگذاری Unicode کد 0041h هگز را می دهد.
نکته1. تفاوت يک حرف بزرگ با يک حرف کوچک تنها در بيت
شماره 5 است؛ اين بيت در حروف بزرگ 0 و در حروف کوچک 1 است. ("m"= 01101101 و "M"=
01001101)
نکته2. ارقام 0 تا 9 کدهای 30h تا 39h را دارا می باشند.
نکته3. کاراکترهای قابل چاپ بين 20h تا 7Eh است.
نکته4. کاراکترهای 0 تا 1Fh و 7Fh کاراکترهای کنترلی نام دارند که قابل رويت نمی باشند.
نکته5. کاراکتر ESC با کد 1Bh همراه با کاراکترهای ديگر اغلب برای يک عمل خاص به دستگاه های
جانبی ارسال می شود.
نکته6. کدهای 41 تا 5Ah کاراکترهای A تا Z و کدهای 61 تا 7Ah کاراکترهای a تا z هستند.
نکته7. کاراکتر CR و LF با کدهای 0Dh و 0Ah به ترتيب باعث حرکت مکان نما به شروع خط جاری و خط بعد می شود.
کاهش و افزايش طول داده
در اسمبلی کليه داده ها اندازه مشخص شده ای دارند. گاهی ناچار به تغيير اندازه داده هستيم. برای کاهش اندازه داده کافی است بيت های با ارزش حذف شوند. اين روش برای اعداد بدون علامت و علامت دار کار می کند. قاعده کلی اين است که برای اعداد بدون علامت کليه بيت های حذف شده بايد صفر باشند. و برای اعداد علامت دار بيت های حذف شده بايد همگی يا 1 و يا 0 باشند. البته اگر عدد را نتوان به طرز صحيح در اندازه کوچکتر نمايش داد کاهش اندازه کار نمی کند.
افزايش داده پيچيده تر از کاهش است. عدد هگز FF را اندازه بگيريد. گسترش آن بستگی دارد که آن را چطور تفسير کنيم. اگر آن را يک عدد بدون علامت درنظربگيريم(يعنی عدد 255)، به صورت 00FF گسترش داده می شود و اگر علامت دار باشد(يعنی 1-) به صورت FFFF. به طور کلی برای گسترش اعداد بدون علامت کليه بيت های جديد عدد گسترش يافته صفر می شوند ولی برای گسترش يک عدد علامت دار بايد بيت علامت را بسط داد، به اين معنا که.بيت های جديد بيت علامت را در خود کپی می کنند.
ساختمان کامپيوتر
اين بخش شرح مختصری پيرامون اجزاي اصلی يک سيستم کامپيوتری (حافظه و پردازنده)می دهد، که باعث می شود کاربر درک بيشتری نسبت به مفاهيمی که در طی برنامه اسمبلی با آن ها سرو کار دارد پيدا کند.
يک سيستم کامپيوتری ترکيب کاملي از سخت افزار و نرم افزارهای سيستمی است که باعث می شود ماشين مفيد و وظيفه مندي برای کار معينی بشود.
اجزای اصلی سخت افزار يک ريز کامپيوتر شامل:
• پردازنده مرکزی
• حافظه
• صفحه کليد به عنوان ورودی
• صفحه نمايش به عنوان خروجی
• يک يا چند ديسک درايو برای ذخيره برنامه ها و داده ها
حافظه
حافظه مکان ذخيره برنامه ها و داده ها با امکان دسترسی مجدد به آنها است. حافظه اصلی از ديد برنامه نويس از تعدادی بيت تشکيل شده است که قادر به نگهداری صفر يا يک است. مکانيسم دسترسی به اطلاعات درون حافظه آدرس دهی است. بيت هائی که دارای آدرس يکسان هستند را سلول حافظه (cell) می نامند. هر سلول تنها می تواند شامل يک مقدارعددی باشد. طول سلول(Lc) توسط تعداد بيت های سلول مشخص می شود. در ريز کامپيوترها طول سلول هشت بيت است که به آن بايت نيز گفته می شود. خاصيت مهم سلول آدرس پذيری است، يعنی هر سلول دارای يک آدرس منحصر بفرد است. بنابراين هر بايت درحافظه نيز دارای يک آدرس منحصر بفرد است.
اغلب حافظه ها در اندازه های بزرگتراز بايت نظير کيلوبايت (1KB=210=1,024 bytes)، مگابايت (1MB=220= 1,048,576 bytes) و گيگابايت (1GB=230=1,073,741,824 bytes) بيان می شوند. يک کامپيوتر با 32 مگابايت حافظه قادر است تقريبا 32 ميليون بايت از اطلاعات را نگهداری کند.
نکته. تعداد بيت های يک کلمه بستگی به سخت افزار دارد و با Lw نشان داده می شود. همواره رابطه Lw≥Lc برقرار است. آدرس هر کلمه آدرس اولين سلول آن است.
فضای آدرسی
آدرس های حافظه از عدد صفر شروع می شوند. اگر حافظه ای دارای n سلول باشد آدرس های آن از 0 تا n-1 خواهد بود. کامپيوتری که سيستم عددی باينری را استفاده می کند برای بيان آدرس نيز همان روش را به کار می برد. تعداد بيت های آدرس تعداد سلول های قابل دسترس حافظه را نشان می دهد و ربطی به طول سلول ندارد. فضای آدرسی بيشترين ميزان حافظه است که يک پردازنده می تواند آدرس دهی کند.
اگر آدرسی m بيت طول داشته باشد بيشترين تعداد سلول های قابل آدرس دهی 2m خواهد بود.
واحد پردازش مرکزی
پردازنده يا واحد پردازش مرکزی (Central Processing Unit) يا (CPU) از واحد کنترل و واحد محاسبات و منطق ساخته شده است. وظيفه آن خواندن و نوشتن محتويات سلول حافظه، انتقال داده بين سلول های حافظه و ثبات های خاص، رمزبرداری و اجرای دستورالعمل های ذخيره شده در حافظه اصلی است.
CPU هر دستورالعمل را در يک سری مراحل اجرا می کند و برای همگام کردن سيکل اجرای دستورالعمل از يک ساعت (Clock) استفاده می کنند. ساعت در يک فرکانس ثابت پالس می زند که سرعت ساعت ناميده می شود. اين ساعت دقيقه و ثانيه را نگه نمی دارد بلکه فقط در نرخ ثابتی ضربان دارد. مدارهای الکترونيکی کامپيوتر از اين ضربان ها برای انجام صحيح عمليات خود استفاده می کنند. تعداد ضربه ها يا اصطلاحا سيکل های مورد نياز يک دستورالعمل بستگی به نسل و مدل CPU دارد.
مثال. وقتی يک کامپيوتر 1.5GHz می خريد، 1.5 GHz فرکانس اين ساعت است. يعنی در هر ثانيه 1.5 ميليارد پالس می زند (گيگاهرتز GHz يا يک ميليارد سيکل در ثانيه است).
مجموعه دستورالعمل ها
مجموعه ای از تمام دستورالعمل هائی که يک نوع پردازنده می تواند اجرا می کند مجموعه دستورالعمل (Instruction Set) ناميده می شوند که درواقع زبان ماشين آن نوع پردازنده را شکل می دهد. دستورالعمل های زبان ماشين به صورت اعداد رمز می شوند و عموما ساده هستند. زيرا زبان ماشين با اين هدف طراحی می شود که پردازنده قادر باشد مقصود دستورالعمل را سريع کشف کند تا بتواند به طور موثر آن را اجرا کند..
هر پردازنده زبان ماشين منحصر بفرد خود را دارد. و مجموعه دستورالعمل از ماشينی به ماشين ديگر متفاوت است. به همين دليل مثلا برنامه های نوشته شده برای Mac نمی توانند روی يک IBM-PC اجرا شوند. برنامه های نوشته شده در زبان های ديگر بايد توسط کامپايلر به زبان ماشين پردازنده ای که روی آن اجرا می شود تبديل شود. معمولا عملکرد کامپايلرها بر روی ماشين با دستورالعمل کمتر آسان تر است.
مجموعه ثبات ها
دستورالعمل ها ممکن است نياز به داده ای داشته باشند تا روی آن عمل کند. هر پردازنده دارای يکسری سلول های حافظه است که داده های دستورالعمل را در خود ذخيره می کنند. اين سلول ها ثبات (register) ناميده می شوند و درون خود پردازنده قرار دارند. پردازنده می تواند به داده درون ثبات سريع تر از داده درون حافظه دسترسی پيدا کند. اغلب کامپيوترها مجموعه ای از ثبات ها را برای ذخيره موقت داده دارند. البته تعداد ثبات های پردازنده اندک است، بنابراين برنامه نويس ناچار است تنها داده های جاری را در ثبات ذخيره نمايد.
انواع پردازنده ها
پردازنده ها به گروه های زير دسته بندی می شوند:
1. Complex
Instruction Set Computers - CISC
• پردازنده هائی که مجموعه دستورالعمل کاملی با
پشتيبانی سخت افزاری برای انواع وسيعی ازعمليات را دارند. در عمليات علمی، مهندسی
و رياضی معمولا اکثر کارها را در کوتاهترين زمان انجام می دهند.
2. Reduced
Instruction Set Computers - RISC
• پردازنده هائی که مجموعه دستورالعمل فشرده و
کوچکی دارند. در کاربردهای تجاری و برنامه هائی که توسط کامپايلر ايجاد شده اند
معمولا اکثر کارها را در کوتاهترين زمان انجام می دهند.
3. Hybrid
• پردازنده هائی که ترکيبی از روش CISC و RISC هستند و
سعی دارند تعادلی بين مزايای هر دو روش برقرار کنند.
4. Special
purpose
• پردازند هائی که برای وظايف خاصی بهينه شده اند. Digital signalprocessors و انواع co-processors نوع متعارف اين دسته هستند.
5. Hypothetical
• پردازنده هائی که هنوز وجود ندارند يا هرگز وجود
نداشته اند. پردازنده هائی که در فاز طراحی هستند يا برای کارهای نظری درنظر گرفته
شده اند. معروف ترين آنها MIX است که يک پردازنده فرضی آموزش ساخته شده توسط Donald E. Knuth برای ارائه الگوريتم های کامپيوتری است.
ريزپزدازنده های اينتل
با توجه به اينکه دستورات اسمبلي 8086 در قسمت ها آينده بررسي مي شوند، در اين صفحه با نحوه آدرس دهي حافظه و ثبات هاي اين پردازنده آشنا خواهيد شد.
خانواده 80x86
آدرس دهي سگمنتي
مدهاي اجرا
مجموعه ثبات ها
خانواده 80x86
کليه کامپيوترهای شخصی IBM پردازنده ای از خانواده 80×86 دارند. پردازند های اين خانواده همگی دارای ويژگي های مشترکی ازجمله زبان ماشين پايه يکسان هستند. البته اعضای جديد ويژگي های خود را به ميزان زيادی افزايش داده اند.
تعدادی از پردازنده های اين خانواده بدين شرح می باشند:
(1979)8088,(1978)8086
• اين CPU ها، که از
ديدگاه برنامه نويسی برابر هستند، پردازنده هائی بودند که روی اولين کامپيوترهای
شخصی به کار رفته اند. دارای ثبات های 16 بيتی (AX، BX، CX، DX، SI، DI، BP، SP، CS، DS، SS، ES، IP و FLAGS ) هستند
و تنها در مد حقيقی عمل می کردند. 8086 دارای گذرگاه داده 16 بيتی و گذرگاه آدرس
20 بيتی بود و بنا براين قابليت آدرس دهی تا 1 مگابايت حافظه را داشت و می توانست
با داده های 8 يا 16 بيتی همزمان کار کند. 8088 با گذرگاه داده 8 بيتی به طراحان
اجازه پيچيدگی کمتر و ارزانتر سيستم های کامپيوتری را می داد.
(1983)80286
• اين پردازنده، که در کامپيوترهای شخصی کلاس AT استفاده
شد، دستورالعمل های جديدی را به زبان ماشين 8086/88 اضافه کرد. اما ويژگی اصلی آن
مد محافظت شده 16 بيتی بود که در اين حالت می توانست تا 16 مگابايت حافظه را
دسترسی پيدا کند. البته برنامه ها همچنان به سگمنت هائی تقسيم بندی می شدند که نمی
توانستند بيشتر از 64K باشند.
(1986)80386
• اولين پردازنده 32 بيتی که توسط اينتل معرفی شد
80386 DX بود که علاوه بر حفظ سازگاری با پردازنده های قبلی اجرای عالی
داشت. اين پردازنده چند ثبات را به 32 بيتی گسترش داد (EAX, EBX, ECX, EDX, ESI,
EDI, EBP,ESP, EIP) و دو ثبات جديد 16 بيتی FS و GS را
اضافه کرد. دارای گذرگاه های آدرس 32 بيتی بود و در مد محافظت شده 32 بيتی می
توانست تا 4 گيگابايت حافظه فيزيکی را آدرس دهی کند. برنامه ها دوباره به سگمنت ها
تقسيم می شدند اما اندازه هر سگمنت می توانست تا 4 گيگا بايت باشد. نسخه 16 بيتی
آن 80386 SX با گذرگاه آدرس 24 و داده 16 بيتی در 1988 بيرون آمد که تنها تا
16 مگابايت را دسترسی داشت.
(1989)80486
• 80486 DX دارای حافظه نهان
و کمک پردازنده رياضی در يک تراشه بود که حدود 50% سريع تر از 80386 بود. 80486 SX را هم
معرفی شد که تنها پيوند آن با ميکروپروسسور رياضی وجود نداشت.
( 1993)Pentium/Pentium Pro
• پردازنده های 64 بيتی پنتيوم، که چند دستورالعمل
را در يک زمان اجرا می کند، سرعت اجرای دستورالعمل ها را بالابردند. اين پردازنده
ها دارای گذرگاه داده 64بيتی و گذرگاه آدرس 32 بيتی هستند. پنتيوم از نظر کارائی
دوبار سريع تر از 80486 است و عمليات مميزشناور را سريع تر انجام می دهد درعين حال
که کاملا با قبلی ها سازگاری دارد.
PentiumMMX
• اين پردازنده دستورات MMX (MultiMedia eXtensions) را به پنتيوم اضافه کرد. اين دستورالعمل ها می توانند عمليات
گرافيکی معمول را سرعت ببخشند.
(1997)Pentium II
• اين پردازنده توسعه يافته پنتيوم است که قادر است
4 پردازنده را همزمان پشتيبانی کند و به 64 گيگابايت حافظه دسترسی دارد. درواقع يک
پردازنده پنتيوم پرو همراه با دستورالعمل های MMX است.
(1999)Pentium III/(2002)Pentium IV
• اين پردازنده ها تنها سرعت اجرای دستورالعمل ها
را بالا بردند.
آدرس دهی سگمنتی
پردازنده های 8086 دارای گذرگاه 20 بيتی هستند، بنابراين
می تواند تا 1 مگابايت حافظه را آدرس دهد(از آدرس 00000 تا 1MB=1048575=FFFFF). اين
آدرس ها به يک عدد 20 بيتی احتياج دارند. روشن است که يک عدد 20 بيتی را نمی توان
در ثبات های 16 بيتی 8086 جا داد. اينتل اين مشکل را با آدرس دهی سگمنتی (segment addressing) حل کرد. سگمنت يک تکه از حافظه با اندازه 64 کيلوبايت است. يک
محل از حافظه با يک آدرس سگمنت و يک آفست (offset) مشخص می شود که
به صورت دو عدد 16 بيتی نشان داده می شوند. آدرس سگمنت به سگمنتی در حافظه اشاره
می کند که حاوی محل مورد نظر است. هر سگمنت از يک پاراگراف می تواند شروع شود. هر
پاراگراف 16 بايـت دارد، بنابراين سگمنت از آدرسی که مضربی از 16 است شروع می شود.
يعنی سگمنت اول از آدرس 00000، سگمنت دوم از آدرس 00010، بعدی از آدرس 00020 و الی
آخر شروع می شود. در نتيجه آدرس شروع هر سگمنت از سمت راست به صفر ختم می شود که
از آن صرفنظر می شود. بنابراين آدرس سگمنت هميشه به صورت يک عدد 4 رقمی هگز نوشته
می شود.
آفست فاصله بايت مورد نظر از ابتدای سگمنت را مشخص می کند. با توجه به اينکه هر
سگمنت 64KB حافظه دارد، آفست می تواند بين 0000 تا ffff باشد.
بنابراين آفست نيز هميشه يک عدد 4 رقمی هگز است.
آدرس سگمنتی به صورت آفست:سگمنت نوشته می شود.
مثال 1. آدرس فيزيکی 18A3:5B27 به بايتی در سگمنت 18A30 اشاره دارد که از ابتدای اين سگمنت 5B27 بايت فاصله دارد.
مثال 2. آدرس فيزيکی 04808 می تواند توسط 047C:0048 رجوع شود.
آدرس های سگمنت-آفست يک آدرس منطقی را تعيين می کنند. برای ساختن آدرس فيزيکی 20 بيتی طبق فرمول زير محتوای آدرس سگمنت را در 16 ضرب کرده با آدرس آفست جمع می کنيم:
16× segment + offset
ضرب در 16 آسان است کافی است يک صفر در سمت راست عدد گذاشته شود.
مثال 3. آدرس فيزيکی رجوع شده توسط 047C:0048 برابر است با:
047C0+0048=04808
سگمنت ها روی هم می توانند قرار بگيرند بنابراين يک بايت، با داشتن آدرس فيزيکی منحصر بفرد در حافظه، می تواند از طريق چندين ترکيب سگمنت:آفست بدست می آيد.
مثال 4. آدرس فيزیکی 04808 می تواند توسط 047C:0048، 047D:0038، 047E:0028 يا 047B:0058 رجوع شود.
سگمنت های برنامه
سه ناحيه از سگمنت های حافظه که هر يک می توانند 64KB باشند برای يک برنامه در نظر گرفته می شوند:
1. سگمنت کد
• شامل دستورالعمل های زبان ماشين برنامه ای که
دارد اجرا می شود. اولين دستور اجرائی برنامه در ابتدای اين سگمنت قرار دارد و
سيستم عامل CPU را برای اجرای برنامه به اين محل ارجاع می دهد.
2. سگمنت داده
• شامل داده های تعريف شده و ناحيه کاری که برنامه
نياز دارد.
3. سگمنت پشته
• شامل آدرس های برگشتی از زيربرنامه ها و داده های
محلی است .
نکته 1. برنامه و داده در هر سگمنتی از حافظه می توانند قرار گيرند، فقط آدرس شروع سگمنت بايد برای CPU تعريف شده باشد. اين آدرس ها در ثبات های سگمنت ذخيره می شوند و اغلب درطول اجرای برنامه ثابت باقی می مانند. در عمل هنگام برنامه نويسی تنها از آدرس 4 رقمی آفست استفاده می شود.
نکته 2. سگمنت ها می توانند روی همديگر بيافتند. در بعضی مواقع که برنامه کوتاه است سگمنت داده می تواند از داخل سگمنت کد شروع شود به شرط اينکه تداخل رخ ندهد.
مدهای اجرا
پردازنده های 80286 به بعد دارای دو مد حقيقی (real mode) و محافظت شده (protected mode) براي اجرا هستند. تعاريف سگمنت داده شده در قسمت بالا بر اساس مد حقيقی است.
در مد حقيقی پردازنده مانند 8086 عمل می کند. ارجاع به حافظه توسط يک آفست 16 بيتی درون يک سگمنت تعيين می شود. آدرس فيزيکی 20بيتی طبق فرمول آفست + 16×سگمنت بدست می آيد. به اين طريق تا يک 1MB حافظه قابل آدرس دهی است. اما در هر لحظه فقط تا 64KB را می توان آدرس داد. در اين حالت يک برنامه به هر آدرسی از حافظه دسترسی دارد حتی حافظه برنامه های ديگر که باعث می شود اشکالزدائی و امنيت بسيار دشوار بشود.
کليه برنامه های تحت DOS در مد مجازی اجرا می شوند.
در مد محافظت شده پردازنده می تواند از قابليت های خود در گذرگاه های آدرس و داده به طور کامل استفاده کنند. در اين مد می تواند حافظه بيشتری را آدرس دهی کند و برنامه ها را از دسترسی حافظه های يکديگر محافظت می کرد.
مد محافظت شده تکنيکی به نام حافظه مجازی را استفاده می کند که برپايه نگهداری قسمتی از داده و کد در حافظه است که برنامه دارد اجرا می کند. بقيه داده و کد تا زمانی که مورد نياز باشند روی ديسک نگهداری می شوند. سگمنت ها بين حافظه و ديسک در صورت نياز منتقل می شوند و برخلاف مد حقيقی مکان های ثابتی در حافظه ندارند. اطلاعات سگمنت ها درون جدولی ذخيره می شود. ايندکس جدول هنگام آدرس دهی در ثبات سگمنت قرار می گيرد.
مجموعه ثبات ها
پردازنده 8086 دارای 14 ثبات 16 بيتی با کاربردهای متفاوت است. اين ثبات ها را می توان به صورت زير گروه بندی کرد:
1. ثبات های همه منظوره : AX، BX، CX و DX
2. ثبات های ايندکس : SIو DI
3. ثبات های آدرسی : BP،SP و IP
4. ثبات های سگمنت : CS، DS، SS و ES
5. ثبات های وضعيتی : Flag
دياگرام ثبات هاي ريزپردازنده 8086
ثبات های همه منظوره
CPU اوليه 8086 با چهار ثبات همه منظوره طراحی شد که در دستورات محاسباتی و ورودی/خروجی استفاده می شوند. هرکدام از اين ثبات ها يک يا چند وظيفه خاص هم دارند.
ثبات های همه منظوره می توانند به صورت 8 يا 16 بيتی استفاده شوند.هر کدام از آنها از دو بايت تشکيل شده اند؛ بايت سمت چپ را Low Order و سمت راست را High Order می نامند.
|
AX |
Accumulator Register |
همه منظوره ترين ثبات است و معمولا برای هر کاری از جمله عملياتورودی/خروجی،رشته ای و محاسباتی به کار می رود از دو جزء AL و. AH تشکيل شدهاست |
|
BX |
Base Register |
تنها ثباتی که می تواند بعنوان ايندکس در آدرس دهی مورد استفادهقرار می گيرد. شامل دو قسمت BL و BH است |
|
CX |
Count Register |
بعنوان شمارنده در کنترل تعداد دفعات تکرار در دستور حلقه استفادهمی شود. دارای دو قسمت CL و CH است |
|
DX |
Data Register |
در اعمال ورودی/خروجی و عمليات ضرب و تقسيم استفاده می شود. دارایدو بخش DL و DH است |
ثبات های سگمنت
برای آدرس دهی به هر يک از اين سگمنت های برنامه يک ثبات وجود دارد که مشخص می کند کدام بخش حافظه برای قسمت های مختلف برنامه به کار رفته است.
|
CS |
Code Segment |
شامل آدرس شروع سگمنت کد، که به CPU می فهماند دستورالعمل هایبرنامه در کجا قرار دارند |
|
DS |
Data Segment |
شامل آدرس شروع سگمنت داده که به پردازنده می فهماند داده ها وفضای کاری در کجا قرار دارد |
|
SS |
Stack Segment |
آدرس شروع سگمنت پشته را در خود ذخيره می کند |
|
ES |
Extra Segment |
آدرس شروع سگمنت اضافی، سگمنت دادهدوم |
ثبات های ايندکس
دو ثبات 16 بيتی ايندکس وجود دارد که اغلب به عنوان اشاره گر به همراه DS به کار می روند تا به داده های موجود در سگمنت داده دسترسی شود. اما می توانند به همان منظورهای ديگر، مانند ثبات های همه منظوره، هم استفاده شود؛ گرچه نمی توانند به دو بخش 8 بيتی تجزيه شوند.
|
SI |
Source Index |
برای آدرس دهی و در عمليات رشته ای بعنوان مبدا استفاه میشود |
|
DI |
Destination Index |
برای آدرس دهی و در عمليات رشته ای بعنوان مقصد استفاه میشود |
ثبات های اشاره گر
ثبات های اشاره گر نگهدارنده بخش آفست در آدرس دهی هستند و همراه با يکی از ثبات های سگمنت به محلی از حافظه اشاره دارند. طبق پيش فرض ثبات های همه منظوره و ايندکس همراه با DS و ثبات های پشته همراه با SS و IP همراه با CS استفاده می شوند.
|
IP |
Instruction Pointer |
همراه با ثبات CS به دستورالعمل بعدی که بايد توسط CPU اجرا شوداشاره می کند |
|
SP |
Stack Pointer |
آفست مکانی از سگمنت پشته که عمل قرار گرفتن داده در پشته صورت میگيرد. به عبارت ديگرSS:SP به بالای پشته اشاره دارد |
|
BP |
Base Pointer |
برای دسترسی به متغيرهای محلی که در پشته قرار دارند استفاده میشود |
ثبات FLAGS
فلگ ها اطلاعاتی درباره نتايج اجرای دستورالعمل قبلی را
نگه می دارند. اين نتايج به صورت بيت های مجزا در ثبات وضعيت FLAGS ذخيره
می شوند. 9 بيت از 16 بيت اين ثبات برای تعيين وضعيت فعلی ماشين و نتيجه اجرای
دستورالعمل به کار می روند. هر کدام از اين بيت ها هم فلگ ناميده می شوند زيرا می
توانند 1 (Set) يا 0 (Not
Set) باشند. بسياری از دستورالعمل ها وضعيت اين بيت ها را تغيير می
دهند. گرچه کليه دستورات روی فلگ تاثير نمی گذارند.
اين ثبات فاقد آدرس است و به طور مستقيم توسط برنامه نويس قابل دسترس نمی باشد.
|
CF |
Carry Flag |
محتوی رقم نقلی بوجود آمده از باارزش ترين بيت در عمليات محاسباتیيا چرخش |
|
PF |
Parity Flag |
برای کنترل صحت انتقال داده. اگر صفر باشد تعداد بيتهای انتقالیفرد است و اگر يک باشد زوج است |
|
AF |
Auxiliary Carry |
محتوی رقم نقلی از بيت سوم به چهارم در يک بايت است. در عمليات BCD کاربرد دارد |
|
ZF |
Zero Flag |
اگر نتيجه عمليات محاسباتی صفر باشد اين بيت 1 است در غير اينصورتصفر است |
|
SF |
Sign Flag |
در صورت منفی بودن نتيجه عمليات اين بيت 1 است در غير اينصورت صفزاست |
|
TF |
Trap Flag |
برای اجرای دستورالعمل به صورت دستور به دستور اين بيت بايد 1باشد |
|
IF |
Interrupt Flag |
اگر 1 باشد وقفه فعال است و اگر صفر باشد وقفه غير فعال است يعنیسيستم وقوع وقفه را ناديده می گيرد |
|
DF |
Direction Flag |
اگر 1 باشد عمل مقايسه يا انتقال داده از سمت راست به چپ صورت میگيرد در غير اينصورت از چپ به راست |
|
OF |
Overflow Flag |
اگر در باارزش ترين بيت سرريزی وجود داشته باشد اين بيت يک می شود. (توضيحات بيشتر درمحاسبات مکمل 2داده شدهاست) |