اصول دیجیتال و پردازنده
Digital design and microprocessor

 
تاريخ : چهارشنبه دوم اردیبهشت 1388

Statement: Exchange the contents of memory locations 2000H and 4000H

Program 1:

 

  LDA 2000H        : Get the contents of memory location 2000H into accumulator

  MOV B, A        : Save the contents into B register

  LDA 4000H        : Get the contents of memory location 4000Hinto accumulator

  STA 2000H         : Store the contents of accumulator at address 2000H

  MOV A, B        : Get the saved contents back into A register

  STA 4000H        : Store the contents of accumulator at address 4000H

 

Program 2:

       LXI H 2000H            : Initialize HL register pair as a pointer to memory  location 2000H.

       LXI D 4000H                : Initialize DE register pair as a pointer to memory location 4000H.

       MOV B, M                 : Get the contents of memory location 2000H into B register.

       LDAX D                : Get the contents of memory location 4000H into A register.

       MOV M, A                : Store the contents of A register into memory location 2000H.

       MOV A, B                : Copy the contents of B register into accumulator.

       STAX D                : Store the contents of A register into memory location 4000H.

       HLT                        : Terminate program execution.

 

In Program 1, direct addressing instructions are used, whereas in Program 2, indirect addressing instructions are used.

 

 

 

Statement: Store the data byte 32H into memory location 4000H

 

Program 1:

 

MVI A, 52H        : Store 32H in the accumulator

STA 4000H                : Copy accumulator contents at address 4000H

HLT                        : Terminate program execution

 

Program 2:

 

LXI H                : Load HL with 4000H

MVI M          : Store 32H in memory location pointed by HL register pair (4000H)

HLT                : Terminate program execution

 

The result of both programs will be the same. In program 1 direct addressing instruction is used, whereas in program 2 indirect addressing instruction is used.

 

 

 

 

Statement: Calculate the sum of series of numbers. The length of the series is in memory location 4200H and the series begins from memory location 4201H.

a. Consider the sum to be 8 bit number. So, ignore carries. Store the sum at memory location 4300H.

b. Consider the sum to be 16 bit number. Store the sum at memory locations 4300H and 4301H.

 

a. Sample problem

 

4200H  = 04H

4201H  = 10H

4202H  = 45H

4203H  = 33H

4204H  = 22H

Result = 10 +41 + 30 + 12 =  H

4300H  =  H

 

Source program:

 

LDA 4200H

MOV C, A                : Initialize counter

SUB A                        : sum = 0

LXI H, 420lH                : Initialize pointer

BACK:        ADD M                : SUM = SUM + data

INX H                        : increment pointer

DCR C                        : Decrement counter

JNZ BACK                : if counter  0 repeat

STA 4300H                : Store sum

HLT                        : Terminate program execution

 

 

 

b. Sample problem

 

4200H =  04H        

420lH  = 9AH

4202H = 52H

4203H = 89H

4204H = 3EH

Result = 9AH + 52H + 89H + 3EH = H

4300H = B3H Lower byte

4301H = 0lH Higher byte

 

Source program:

 

               LDA 4200H

               MOV C, A                : Initialize counter

               LXI H, 4201H                : Initialize pointer

               SUB A                        :Sum low = 0

               MOV B, A                : Sum high = 0

       BACK: ADD M                        : Sum = sum + data

               JNC SKIP                

               INR B                        : Add carry to MSB of SUM

       SKIP: INX H                        : Increment pointer

               DCR C                        : Decrement counter

               JNZ BACK                : Check if counter 0 repeat

               STA 4300H                : Store lower byte

               MOV A, B

               STA 4301H                : Store higher byte

               HLT                        :Terminate program execution

 

Statement: Multiply two 8-bit numbers stored in memory locations 2200H and 2201H by repetitive addition and store the result in memory locations 2300H and 2301H.

 

Sample problem:

 

       (2200H) = 03H

       (2201H) = B2H

               Result = B2H + B2H + B2H = 216H

                      = 216H

       (2300H) = 16H

       (2301H) = 02H

 

Source program

 

               LDA 2200H

               MOV E, A

               MVI D, 00                : Get the first number in DE register pair

               LDA 2201H                

               MOV C, A                : Initialize counter

               LX I H, 0000 H        : Result = 0

       BACK: DAD        D                : Result = result + first number

               DCR        C                : Decrement count

               JNZ        BACK                : If count   0 repeat

               SHLD 2300H                : Store result

               HLT                        : Terminate program execution

 

Statement:Divide 16 bit number stored in memory locations 2200H and 2201H by the 8 bit number stored at memory location 2202H. Store the quotient in memory locations 2300H and 2301H and remainder in memory locations 2302H and 2303H.

 

Sample problem

       (2200H) = 60H

       (2201H) = A0H

       (2202H) = l2H

               Result = A060H/12H = 8E8H Quotient and 10H remainder

       (2300H) = E8H

        (2301H) = 08H

       (2302H= 10H

       (2303H) 00H

 

 

Source program

 

       LHLD 2200H                : Get the dividend

       LDA 2202H                : Get the divisor

       MOV C, A

       LXI D, 0000H                : Quotient = 0

BACK: MOV A, L

       SUB C                        : Subtract divisor

       MOV L, A                : Save partial result

       JNC SKIP                : if CY  1 jump

       DCR H                : Subtract borrow of previous subtraction

SKIP: INX D                        : Increment quotient

       MOV A, H

       CPI, 00                : Check if dividend < divisor

       JNZ BACK                : if no repeat

       MOV A, L

       CMP C

       JNC BACK

       SHLD 2302H                : Store the remainder

       XCHG

       SHLD 2300H                : Store the quotient

       HLT                        : Terminate program execution

 

 

 

شکوفه رضایی پور   sh.sare@yahoo.com  

 

 



ارسال توسط شکوفه رضایی پور
 
تاريخ : سه شنبه یکم اردیبهشت 1388

خانواده 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 دارای گذرگاه 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



ثبات های همه منظوره

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) باشند. بسياری از دستورالعمل ها وضعيت اين بيت ها را تغيير می دهند. گرچه کليه دستورات روی فلگ تاثير نمی گذارند.
اين ثبات فاقد آدرس است و به طور مستقيم توسط برنامه نويس قابل دسترس نمی باشد.

Flags
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 داده شده است)

منبع http://www.hpkclasses.ir

ارسال توسط شکوفه رضایی پور

اسلایدر