سازمان سخت افزار كامپيوتر :

                                                                   CPU

 

Cu

 

Register

Instruction Quc

ALU

Bus

L/O

Memory

 

 

 

 

 

 

 

 

 

 

 


Cu يا واحد كنترل: وظيفه كنترل اجراي دستورات ، تشخيص نوع دستور و كنترل ساير اجزا را بر عهده دارد.

Alu يا واحد محاسبه و منطق : وظيفه ي اجراي فرامين را برعهده دارد. نتيجه حاصل از اجراي يك فرمان ممكن است بر روي regestery تا l/o يا memory تاثير بگذارد.

(LQ) Instruction يا صف دستورالعمل ها : وظيفه ي بافر كردن فرامين واشش از حافظه را بر عهده دارد . به دليل تفاوت سرعت ميان cpu و Ram هنگام فراخواني يا واكنش دستورات تعدادي از اين فرامين به cpu انتقال مي يابد كه آنها را در IQ يا صف دستورالعمل ها قرار مي دهيم.

BUS يا گذرگاه : وظيفه انتقال اطلاعات بين اجزاي داخلي CPU و عناصرI/O و memory را برعهده دارد. بطور كلي دو bus داده و آدرس در كامپيوتر وجود دارد.

L/O يا دستگاههاي جانبي كه وظيفه دريافت اطلاعات از كاربر و نمايش اطلاعات به كاربر را برعهده دارند.

Memory : همان حافظه اصلي كامپيوتر است كه به آن Ram نيز مي گويند تمام برنامه 2 براي اجرا شدن بر روي حافظه Ram بار (load) مي شوند.

يك برنامه تشكيل شده از تعدادي فرامين كه مي بايست به ترتيب خاص اجرا شود وظيفه cpu در اجراي يك برنامه واكشش اين فرامين و اجراي آنهاست.

Ram از تعدادي خانه هاي حافظه كه پشت سرهم قرار دارند تشكيل شده است  هر خانه از حافظه Ram 1 بايت يا 8 بيت فضا دارد. هم چنين هر خانه از فضاي Ram داراي آدرس منحصر به فردي است كه اين ادرسها بصورت پيوسته مي باشد.

 

آدرس دهي:

در زبانهاي برنامه نويسي از دو نوع آدرس دهي براي مشخص كردن خانه اي از حافظه Ram استفاده مي شود.

1- آدرس دهي مطلق : كه دقيقا خانه اي از حافظه را مشخص مي كند و توسط سخت افزار مورد استفاده قرار مي گيرد.

2- آدرس دهي نسبي يا offset : كه به صورت نسبي خانه اي از حافظه را مورد اشاره قرار مي دهد و توسط نرم افزار و برنامه نويس استفاده مي شود.

* نكته :

بدليل اينكه در هنگام برنامه نويسي ، برنامه نويس نمي داند درآينده برنامه در كجاي حافظه بار خواهد شد بنابراين نمي تواند از آدرس دهي مطلق استفاده كند.

-        آدرس offset يعني فاصله از ابتداي برنامه .

......

 

 

 

 

 

 

100

Ram

100

برنامه

آدرس ابتداي

 برنامه

آدرس offset

 

 

 

 


مثال از جمع و تفريق :

 

وقتي مبنا 2 است مكمل 2 يعني همان مكمل 2 و مكمل r-1 يعني همان مكمل 1

 

101101

-13

45

-18

-19

بدون علامت

بيت  علامت

مكمل 2

مكمل 2


ثبات ها (Registery) :

ثباتها حافظه هاي معدود و محدودي اند كه در cpu قرار دارند و از آنها براي ذخيره موقت داده ها براي انجام محاسبات استفاده مي شود. Registery ها را با نام نشان شناسايي مي كنند . ريجسترها به طور كلي به 4 دسته تقسيم مي شوند كه در ادامه به بررسي آنها مي پردازيم. (كلاً 14 تا ثبات داريم و اندازه اش

1- ثبات هاي عمودي                         Ax   Aconulator Register  ثبات انباره

                                                         Bx   Base  Register   ثبات پايه

                                                   Cx   countery Register   ثبات شمارنده

                                                       Dx           Data Register  ثبات داده

 

كاربرد ثبات هاي عمومي :

Ax : از اين ثبات جهت ذخيره موقت داده ها براي انجام محاسبات و هم چنين انتقال تابع وقفه استفاده مي شود.

Bx : از اين ثبات بعنوان ثبات پايه جهت كار با آرايه ها استفاده مي شود.

Cx : از اين ثبات بعنوان شمارنده جهت كنترل تكرار حلقه استفاده مي شود.

  Dx : از اين ثبات بعنوان ثبات كمكي Ax جهت انجام محاسبات و همچنين انتقال مقادير به وقفه ها استفاده مي شود.

* نكته 1 :

كاربردهاي ياد شده براي ثبات ها تنها كاربردهاي آنها نيستند و برنامه نويس مي تواند بسته به نياز از اين ثباتها استفاده كند.

* نكته 2 :

AL

AL

Ax

0

15

Ax

0

31

AL

AL

EAx

ثباتهاي عمومي در حالت عادي 16 بيتي هستند و كاربر مي تواند آنها را به صورت 8 يا 32 بيتي نيز استفاده كند. ( هر چه به سمت چپ مي رويم ارزش اعداد بيشتر مي شود)

1011      0100

0011      1111

 

 

 

 

 

اگر در اول ثبات ها E بگذاريم يعني

Extended ، آنوقت ثبات هايمان 32 بيتي مي شوند كه قسمت دوم آن اسم ندارد.

2- ثبات هاي انديس

(stock pointen) sp  اشاره گر

(base pointen) Ba  اشاره گر پايه

(source index) SI انديس مبدا

(Detination lndex) DI  انديس مقصد

- برخي از ثبات ها سيستمشان (first in first out ) FIFO يعني اولين نفري كه وارد مي شود اولين نفري است كه خارج مي شود.

- برخي ديگر از ثبات ها داراي سيستم (cost in first out) LIFO يعني آخرين نفري كه وارد مي شود اولين نفري است كه خارج مي شود.

- ثبات sp كنترل مي كند. عمليات درج و حذف در LIFO Stack انجام مي گيرد يعني در آرايه به آخرين خانه اشاره مي كند در واقع مي خواهد به ما بگويد كه اگر قرار است عدد جديدي وارد بشه در خانه بعد از آن قرار مي گيرد و اگر هم قرار است عددي خارج بشه آن عددي كه در آن خانه هست بايد خارج شود.

Bp : از اين ثبات جهت انتقال پارامترها به زير برنامه و بازگشت مقادير از زير برنامه ها استفاده مي شود.

DI و SI : از اين دو جهت كار به داده هاي رشته اي استفاده مي شود.

* نكته :

ثبات هاي انديس را به صورت 32 بيتي مي توان استفاده كرد در اين صورت به ابتداي نام هر يك حرف E را اضافه مي كنيم.

3/ ثبات هاي سنگمنت :

(stack segment) ss  سگمنت پشته

(data segment) Ds  سگمنت داده

(code segment) Cs   سگمنت كه

(Extra segment) Es  سگمنت اضافي

- هر برنامه به زبان اسمبلي به چهار بخش (سگمنت) تقسيم مي شود و برنامه نويس دستورات هر بخش را در آن مي نويسد. هنگاميكه يك برنامه اجرا مي شود سگمنت هاي مختلف آن در قسمت هاي متفاوتي از حافظه باز مي شود. از ثبات هاي سگمنت جهت نگهداري آدرس ابتداي هر سگمنت در حافظه استفاده مي شود.

برنامه اسمبلي

stack

Data

Code

Extra

 

براي اجرا به حافظه ي Ram مي رود ولي نه به يكباره بلكه تيكه تيكه

Ram

ss

Ds

Cs

Es

 

 

 

 

 

 

 


- به دليل اينكه برنامه نويس هنگام نوشتن كه برنامه نمي تواند تعيين كند برنامه در چه بخشي از حافظه باز خواهد شد،‌بنابراين نمي تواند از آدرس هاي حقيقي جهت آدرس دهي offset (نسبي، نسبيت به اتداي سگمنت) استفاده مي كنند از طرفي cpu براي اجراي دستورات تنها آدرسهاي فيزيكي را مي شناسد.

بنابراين مي بايست مكانيزمي براي ترجمه ي آدرس offset به آدرس حقيقي وجود داشته باشد. براي اينكار تنها كافيست آدرس ابتداي سگمنت را به آدرس offset جمع كنيم . اما به دليل اينكه سگمنت ها از محل هايي از حافظه شروع مي شوند كه بر 16 قابل تقسيم اند در هنگام جمع كردن در مقابل آدرس ابتداي سگمنت يك صفر مي گذاريم ، سپس جمع مي كنيم.

مثال / با فرض اينكه محتواي ثبات Ds سگمنت 3BF4 هگزاست و متغير x در آدرس ZBF قرار دارد مطلوبست آدرس فيزيكي متغير x ؟

 

 

* نكته :

غالباً مقدار ثباتهاي سگمنت توسط سيستم عامل تعيين مي شود و برنامه نويس در مقدار دهي آن نقش ندارد.

4/ثبات هاي : 1/كنترلي LP = lustraction pointer

2/ وضعيت Flag

ثبات هاي كنترلي (lp) : در اين ثبات آدرس دستور جاري از يك برنامه قرار دارد. (آدرس offset ) مثلاً اگر در حال اجرا دستور خانه 102 از حافظه ي Ram باشد مقدار lp هم برابر 102 است.

با استفاده از اين ثبات مي توانيم شرط ها و حلقه ها را كنترل كنيم.

بيت صفر zero flag           (ZF)

بيت علامت sign flag          (SF)

بيت رقم نقلي (CF)        carry flag

بيت سرريز over flow flag      (OF)

بيت صفر : در صورتيكه نتيجه محاسبات صفر شود اين بيت يك مي شود.

بيت علامت: در صورتي كه نتيجه عمليات منفي شود اين بيت يك مي شود.

بيت رقم نقلي : در صورتيكه نتيجه عمليات داراي رقم نقلي باشد اين بيت يك مي‌شود

بيت سرريز : در صورتيكه نتيجه عمليات در مقصد جا شود اين بيت يك مي شود.

مثلاً صفحات AL كه 8 بيتي است را مي خواهيم در بيت 8 تايي ديگر در آن جاي دهيم كه در اين صورت جا نمي شود.

* بيت سرريز در مورد اعداد علامت دار و بيت رقم نقلي در مورد اعداد بدون علامت مطرح مي شود.

- كاربرد ثبات هاي وضعيت : يكي از كاربردهاي ثبات flag مقايسه دو مقدار با هم است، در اين صورت براي مقايسه A و B ، A-B را مقايسه مي كنيم و تاثير اين محاسبه بر روي flag هاي وضعيت بررسي مي شود و پي به رابطه ي A و B مي برد.

* نكته :

هر خانه از حافظه Ram ، 1 بايت حافظه دارد.

 

تعريف متغيرها در اسمبلي :

براي تعريف متغيرها در زبان اسمبلي از غالب زير استفاده مي شود:

تعريف متغيرها           مقدار پيش فرض                 نوع               نام متغير

انواع داده ها

توضيح نام متغير‌: اسمي است دلخواه كه به يك متغير اختصاص مي يابد و مي بايست از قوانين زير تبعيت كند:

1- نام متغير مي تواند تركيبي از حروف ،‌اعداد باشد.

2/ نام متغير با عدد شروع نشود

3/ از كاراكتر هاي ممنوعه در نام متغير استفاده نشود.

4/ از كلمات كليدي يا رزور شده در نامگذاري استفاده نشود.

5/ حداكثر تعداد كاراكترهاي استفاده شده 32 تاست.

6/ سعي شود از اسامي با معنا استفاده شود.

7/ چند متغير از يك نوع را نمي توان در يك خط تعريف كرد.

- توضح مقدار پيش فرض : در اسمبلي هنگام تعريف يك متغير مي توان مقداري را به آن اختصاص داد. اين مقدار مي تواند در هر يك از مبناهاي (10 و 8 و 16 ) باشد مبناهاي  غير 10 مي بايست مشخص شوند. در صورتيكه يك متغير مقدار پيش فرض نداشته باشد.

به جاي آن علامت سوال (؟) مي گذاريم. در صورتيكه متغيري چند پيش فرض داشته باشد ( مثل آرايه ها) اين مقادير را پشت سر هم و با فاصله كاما (،) مي نويسيم

- توضيح نوع متغير : كلاً متغيرها و اسمبلي سه نوع بيشتر ندارند.

1/ define byte (DB) : نوع داده يك بايتي (8 بيتي) است كه توسط آن مي توان اعداد بدون علامت در محدوده ( 0 تا 255 ) و يا (0 تا ) و اعداد با علامت در محدوده (128- تا 127+ ) و يا (  تا + ) را ذخيره كرد. توسط اين دو داده مي توان داده هاي كاراكتري را نيز ذخيره كرد.

هم چنين داده هاي رشته اي نيز در اين نوع متغير قابل تعريف اند . در اينصورت آدرس كاراكتر اول از رشته در متغير قرار مي گيرد و مابقي كاراكترهاي رشته اي در دنباله كاراكتر اول در خانه هاي حافظه ذخيره مي شوند براي آرايه هم قابل تعريف اند.

به طور كلي آرايه ها به دو روش قابل تعريف اند :

1/ تعريف آرايه ها با مقادير مشخص : كه در اين صورت در قسمت پيش فرض مقادير آرايه را با فاصله كاما مي نويسيم.

2/ آرايه ها با تعداد خانه هاي مشخص : در اين صورت با استفاده از عكس dup  آرايه را تعريف مي كنيم.

* توضيح : در حقيقت با تعريف يك متغير خانه يا خانه هايي ( وابسته به اندازه متغير) را در نظر مي گيريم و به آن برچسبي به نام متغير مي زنيم از اين پس هرگاه بخواهيم با آن خانه از حافظه كار كنيم، از نام متغير استفاده مي كنيم.

مثلاً: اگر  باشد يعني برو به خانه اي كه اسمش x است و مقدار 5 را در آن خانه قرار بدهد. و اگر  باشد يعني برو به خانه اي كه اسمش x است و مقدارش را در خانه ي y قرار بده.

 

(DW) define word : نوع داده دو بايتي است كه توسط آن مي توان اعداد بدون علامت در محدوده (0 تا 65535 ) و اعداد علامت دار در محدوده (32768 – تا 32767+ ) را نگهداري كرد. توسط اين نوع داده همچنين مي توان رشته هاي 2 كاراركتري را نيز ذخيره كرد آرايه ها نيز به همان دو روش گفته شده در DB تعريف مي شود.

* نكته 1

هر متغير از نوع DW دو خانه از حافظه را اشغال مي كند. (هر خانه از حافظه يك بايت است) پس هر متغير DW كه 2 بايت است 2 خانه از حافظه Ram را اشغال مي كند.

* نكته 2

نحوره قرارگيري مقادير در حافظه ابتدا قسمت كم ارزش و سپس قسمت پر ارزش است.

پس 40 = 20 × 20 خانه از حافظه را اشغال مي كند كه در خانه اول مقدار كم ارزش يعني a و در خانه دوم مقدار پر ارزش يعني space-  را قرار مي دهيم و به همين ترتيب ادامه مي دهيم .

* در Dw رشته ها را نمي توان تعريف كرد.

* اعداد باينري 8 بيتي اند.

DD (define duble)  ، نوعي داده 4 بيتي است كه توسط آن مي توان اعداد با علامت و بي علامت بسيار بزرگ را تعريف كرد. توسط اين نوع داده آرايه ها را نيز مي توان تعريف كرد. و هر متغير از نوع DD 4 خانه از حافظه را اشغال مي كند و داده ها را از كم ارزش به پر ارزش در حافظه قرار مي گيرند.