تماس درباره   صفحه اصلی
  زبان اسمبلي > پردازنده هاي خانواده اينتل  
 
 

ريزپزدازنده های اينتل


با توجه به اينکه دستورات اسمبلي 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 است و عمليات مميزشناور را سريع تر انجام می دهد درعين حال که کاملا با قبلی ها سازگاری دارد.
Pentium MMX
     • اين پردازنده دستورات MMX (MultiMedia eXtensions) را به پنتيوم اضافه کرد. اين دستورالعمل ها می توانند عمليات گرافيکی معمول را سرعت ببخشند.
(1997)Pentium II
     • اين پردازنده توسعه يافته پنتيوم است که قادر است 4 پردازنده را همزمان پشتيبانی کند و به 64 گيگابايت حافظه دسترسی دارد. درواقع يک پردازنده پنتيوم پرو همراه با دستورالعمل های MMX است.
(1999)Pentium III/(2002)Pentium IV
     • اين پردازنده ها تنها سرعت اجرای دستورالعمل ها را بالا بردند.


بلوک دياگرام ريزپردازنده 8086


آدرس دهی سگمنتی

پردازنده های 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 رقمی هگز است.

Flags

آدرس سگمنتی به صورت آفست:سگمنت نوشته می شود.


مثال 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 می نامند.

AXAccumulator Register همه منظوره ترين ثبات است و معمولا برای هر کاری از جمله عمليات ورودی/خروجی،رشته ای و محاسباتی به کار می رود از دو جزء AL و. AH تشکيل شده است
BXBase Register تنها ثباتی که می تواند بعنوان ايندکس در آدرس دهی مورد استفاده قرار می گيرد. شامل دو قسمت BL و BH است
CXCount Register بعنوان شمارنده در کنترل تعداد دفعات تکرار در دستور حلقه استفاده می شود. دارای دو قسمت CL و CH است
DXData Register در اعمال ورودی/خروجی و عمليات ضرب و تقسيم استفاده می شود. دارای دو بخش DL و DH است

ثبات های سگمنت

برای آدرس دهی به هر يک از اين سگمنت های برنامه يک ثبات وجود دارد که مشخص می کند کدام بخش حافظه برای قسمت های مختلف برنامه به کار رفته است.

CSCode Segment شامل آدرس شروع سگمنت کد، که به CPU می فهماند دستورالعمل های برنامه در کجا قرار دارند
DSData Segment شامل آدرس شروع سگمنت داده که به پردازنده می فهماند داده ها و فضای کاری در کجا قرار دارد
SSStack Segment آدرس شروع سگمنت پشته را در خود ذخيره می کند
ESExtra Segment آدرس شروع سگمنت اضافی، سگمنت داده دوم

ثبات های ايندکس

دو ثبات 16 بيتی ايندکس وجود دارد که اغلب به عنوان اشاره گر به همراه DS به کار می روند تا به داده های موجود در سگمنت داده دسترسی شود. اما می توانند به همان منظورهای ديگر، مانند ثبات های همه منظوره، هم استفاده شود؛ گرچه نمی توانند به دو بخش 8 بيتی تجزيه شوند.

SISource Index برای آدرس دهی و در عمليات رشته ای بعنوان مبدا استفاه می شود
DIDestination Index برای آدرس دهی و در عمليات رشته ای بعنوان مقصد استفاه می شود

ثبات های اشاره گر

ثبات های اشاره گر نگهدارنده بخش آفست در آدرس دهی هستند و همراه با يکی از ثبات های سگمنت به محلی از حافظه اشاره دارند. طبق پيش فرض ثبات های همه منظوره و ايندکس همراه با DS و ثبات های پشته همراه با SS و IP همراه با CS استفاده می شوند.

IPInstruction Pointer همراه با ثبات CS به دستورالعمل بعدی که بايد توسط CPU اجرا شود اشاره می کند
SPStack Pointer آفست مکانی از سگمنت پشته که عمل قرار گرفتن داده در پشته صورت می گيرد. به عبارت ديگرSS:SP به بالای پشته اشاره دارد
BPBase Pointer برای دسترسی به متغيرهای محلی که در پشته قرار دارند استفاده می شود

ثبات FLAGS

فلگ ها اطلاعاتی درباره نتايج اجرای دستورالعمل قبلی را نگه می دارند. اين نتايج به صورت بيت های مجزا در ثبات وضعيت FLAGS ذخيره می شوند. 9 بيت از 16 بيت اين ثبات برای تعيين وضعيت فعلی ماشين و نتيجه اجرای دستورالعمل به کار می روند. هر کدام از اين بيت ها هم فلگ ناميده می شوند زيرا می توانند 1 (Set) يا 0 (Not Set) باشند. بسياری از دستورالعمل ها وضعيت اين بيت ها را تغيير می دهند. گرچه کليه دستورات روی فلگ تاثير نمی گذارند.
اين ثبات فاقد آدرس است و به طور مستقيم توسط برنامه نويس قابل دسترس نمی باشد.

Flags
CFCarry Flag محتوی رقم نقلی بوجود آمده از باارزش ترين بيت در عمليات محاسباتی يا چرخش
PFParity Flag برای کنترل صحت انتقال داده. اگر صفر باشد تعداد بيتهای انتقالی فرد است و اگر يک باشد زوج است
AFAuxiliary Carry محتوی رقم نقلی از بيت سوم به چهارم در يک بايت است. در عمليات BCD کاربرد دارد
ZFZero Flag اگر نتيجه عمليات محاسباتی صفر باشد اين بيت 1 است در غير اينصورت صفر است
SFSign Flag در صورت منفی بودن نتيجه عمليات اين بيت 1 است در غير اينصورت صفز است
TFTrap Flag برای اجرای دستورالعمل به صورت دستور به دستور اين بيت بايد 1 باشد
IFInterrupt Flag اگر 1 باشد وقفه فعال است و اگر صفر باشد وقفه غير فعال است يعنی سيستم وقوع وقفه را ناديده می گيرد
DFDirection Flag اگر 1 باشد عمل مقايسه يا انتقال داده از سمت راست به چپ صورت می گيرد در غير اينصورت از چپ به راست
OFOverflow Flag اگر در باارزش ترين بيت سرريزی وجود داشته باشد اين بيت يک می شود. (توضيحات بيشتر در محاسبات مکمل 2 داده شده است)

سوالات چندگزينه اي درباره ريزپردازنده هاي اينتل


 


 


صفحه اصلی| PDF| درباره| تماس