مدونة علم البرمجة والحاسوب
من حقك ان تتعلم اكثر

دورة الاسمبلي : الدرس الثالث


 
كما ذكر من قبل أن لغة الأسمبلى تتعامل مع الهارد وير ،كيفهذا ؟وما معنى هذا ؟
سأسرد كيفية التعامل العامه مع الهاردويرعاماً :-
----------------------------------------------------
البياناتالمخزنه أو التى يتعامل معها أى جزء من أجزاء الهارد وير تنقسم إلى قسمين :-
1 -
البيانات (أرقام ، حروف ، .... كل هذا مخزن بالأسكى كود) .
2 -
أوامر (وهى أيضاأصفار ووحايد مخزنه بطريقة ما يتم عمل تنفيذ لها على البيانات السابقه Decoding .

مثلا عند تشغيل برنامج ما يطبع كلمة "Hello" على شاشة الكمبيوتر عند الضغطعلى حرف 'P' ، فإننا هنا نتعامل مع :-
1 -
البروسسور : هو وهو المعالج الذى يقومبتنفيذ كل تعليمه و التوصيل ما بين كل جوانب التعليمه الواحده.
2 -
الرامات : ونتعامل معها هنا على اساس عنوان كلمة "Hello" ، فمثلا نقول أن هه الكلمه مخزنه فىالعنوان 1000H وهذا يعنى عند عد 1000 أماكن بالنظام السداسى عشر (أى 4096 بالنظامالعشرى العادى ) ، فإن أحرف الكلمه ستجدها مخزنه من عند هذا المكان ، ويتم أخذ حرفحرف إلى أن يصل إلى حرف معين و هو الذى ينهى عملية الطباعه و هو '$' . فعندما يجدهذا الحرف يقوم بإنهاء عملية الطباعه و كما نرى أن هذه طريقة التعامل مع النصوص عندكتابتها أو طباعتها على الشاشه عاماً.
3 -
الشاشه : يكون هناك مخزن على كارتالشاشه أو الذاكره الخاصه بالشاشه على الرامات ، يتم وضع حرف حرف بها و يتم إعطاءأمر الطباعه وهو يكون كتابة سلسلة من الأصفار و الوحايد الخاصه و التى تعنى بالنسبهلنظام التعامل مع الشاشه بأن إطبع هذا الحرف ، طيب أين نطبع هذا الحرف ، يوجد مخزن Buffer للإحداثى السينى و آخر للإحداثى الصادى ، فعند طباعة حرف على الشاشه فيتمذيادة الإحداثى السينى بواحد (على اساس أن عرض كل حرف 1 وحده) و عند الوصول إلى آخرالسطر (تخطى عدد معين من الأحرف وهو طول الشاشه) فإن النظام نفسه يتم ذيادةالإحداثى الصادى بواحد و تصفير الإحداثى السينى للبدأ من أول السطر وهكذا .
4 -
الكيبورد : يجب وجود نظام ايضا يسمع إلى الحروف أو الأزرار التى يتم ضغطها علىالكيبورد (فى الحقيقه : عند الضغط على أى زر على الكيبورد فإن الأسكى المقابل لهيسرى عبر الأسلاك إلى وحة التعامل مع الكيبورد على اللوحه الأم و من ثم يخزن على ال Buffers التى توجد هناك ) . بعد سماع كل حرف من هذه المخازن Buffers فإننا نختبرالأسكى لهذا الحرف فلو أنه يقابل قيمة 80 ( المقابل لحرف 'P' فى جدول الأسكى كود ) فنقوم بتشغيل دالة الطباعه من المكان 1000 فى الذاكره ،هذا مثال بسيط لمايتم فعليا داخل الحاسب عند تشغيل هذا البرنامج البسيط ، تخيلوا ما يحدث عند تشغيلالبرامج المعقده الكبيره ، فعلا كان يجب تطوير اللغات فوق بعضها ، كل تعليمه فى لغهعالية المستوى تقابلها مجموعة تعليمات فى اللغات الأقل مستوى و هكذا ، فقط تتميزلغة السمبلى بأن كل تعليمه تقابل تعليمه فى لغة الأله بالظبط .


--------------------------------------------------------------------------------------------------------------------------
توجدوحدات تخزين داخل البروسسور يتم التعامل معها مباشرا فى كل التعاملات داخل الحاسبوهو تماثل ال Buffers فى أى جزء آخر من الهاردوير و تسمى مسجلات Registers ويقومتركيبها من لبوابات المنطقيه عالية السرعه High Speed Logic Gates ، وهى أهم أهمأجزاء البروسسور التى يتم التعامل معها فى نظام السوفتوير كله (التعامل مع هذاالمسجلات مباشرا من خلال لغة الأله ومن ثم لغة الأسنبلى ) .

نقول أنالبروسسور يدعم 32 بت ... هذا يعنى أن طول المسجلات الرئيسيه = 32 بت .
مثلاالبرسسور ال 8088 كان معالج 8 بت ... وهذا يعنى أن طول المسجلات فيه = 8 بت .

الجزء التالى يتحدث على المسجلات بالتفصيل فإنتبه إليه :-
---------------------------------------------------------------

المسجلات REGISTERS :
الكمبيزتر يحتاجفي تعاملاته الى ذاكرة سريعة جداً ومتصلة بالمعالج مباشرة حتى يمكن له أن يخزن فيهاالمعلومات المطلوبة لعملية حسابية معينة أو عداد لحلقة معينة ،هذه الذاكرة تعرفبالمسجلات REGISTERS وهي ذاكرة سريعة جداً تفيد المعالج في أجراء العمليات بسرعهوكفاءة أكبرهناك خمسة أنواع أو تصنيفات للمسجلات ( تختلف هذه التصنيفاتقليلاً من مرجع لآخر ) وهي مسجلات الأغراض العامة General-Purpose Registers ( تعرففي بعض المراجع بمسجلات المعطيات Data Registers ) و هناك مسجلات الأقسام Segment Registers والمسجلات الدليلية Index Registers ومسجلات التأشير Pointer Registers بالأضافة الى مسجلات الحالة والتحكم Status and Control Registers.



المخطط 4_1 : رسم تخطيطي يوضح المسجلات في معالجات ال16 بت


--------------------------------------------------------------------------------



المخطط 4_2 : رسم تخطيطي يوضح المسجلات بعد توسعتها في معالجات ال32بت



[1]
مسجلات الأغراض العامة General-Purpose Registers :-
-----------------------------------------------------------------------------
وهيعبارة عن كل من المسجلات AX و BX و CX و DX ،طول كل منها 16بت أي كلمة أي 2بايتالبايت اليساري فيهما يعرف بالعلوي (High) أما البايت الأيمن فيهما فيعرفبالمنخفض(Low) فمثلاً المسجل AX يتألف من مسجلين العلوي وهو AH والمنخفض وهو AL ،أن تعديل المسجل الجزئي سوف يؤثر في المسجل الأم لأنه جزء منها وأيضاً التعديل فيالمسجل الأم سوف يؤثر في المسجل الجزء ، تم توسيع المسجلات في معالجات ال32 بت معبقاء المسجلات نفسها ولكن كل منها أصبح جزء من مسجل موسع بطول 32بت وهي EAX,EBX,ECX,EDX ، أي أن المسجل EAX هو بطول 32بت وكجزء منه هناك المسجل AX بطول 16بت والذي يتألف هو الآخر من مسجلين هما AL و AH بطول 8بت لكلمنهما.

المسجل AX (مسجل المركم- Accumulator Register) :-
---------------------------------------------------------------------
هذاالمسجل كان من أهم المسجلات في معالجات ال 8بت القديمة جداً حيث كانت كل العملياتالرياضية والمنطقيه تجري من خلاله ولذلك كان يسمى بمسجل المركم لتراكم النواتج فيهلكن معالجات ال16 بت وسعت المرونة وجعلت كل مسجلات الأغراض العامة تستطيع أن تجرىمن خلالها العمليات الرياضيه والمنطقية الا أن المسجل AX مازال المفضل لأجراءها حيثأن أستخدام المسجل AX أو أحد أجزاءه يؤدي مع بعض التعليمات الى توليد شفره أقلأختصاراً (الفرق بايت واحد فقط لكل تعليمية) ، يمكن استخدام المسجل AX كمسجلين هما AL و AH حيث تعرف ال 8بتات الأولى التي في اليسار بالمسجل AL وال8بتات الأخيره التيفي اليمين بالمسجل AH ، أما بالنسبة ل EAX وهو المسجل الموسع ل AX فهو بطول 32بتويعتبر المسجل AX كجزء منه.

المسجل BX (مسجل القاعدة-Base Register) :-
---------------------------------------------------------
هو المسجلالوحيد من بين مسجلات الأغراض العامة الذي يمكن أستخدامه كدليل(INDEX) ، يمكنأستخدام هذا المسجل للعمليات الرياضية والمنطقية وكما المسجلات الأخرى ينقسم هذاالمسجل الى قسمين بطول 8 بت هما BL و BH وهو ضمن مسجل أوسع هو EBX بطول 32بت.

المسجل CX (مسجل العداد-Counter Register) :-
------------------------------------------------------------
يستخد عادةكعداد ويستخدم هذا المسجل بشكل خاص مع تعليمة التكرار LOOP حيث يعمل كعداد لهاوبالطبع يمكن استخدامة في العمليات الرياضية والمنطقيه ، وكما المسجلات الأخرىينقسم هذا المسجل الى قسمين بطول 8 بت هما CL و CH وهو ضمن مسجل أوسع هو ECX بطول 32بت.

المسجل DX (مسجل المعطيات-Data Register) :-
----------------------------------------------------------
يفضلأستخدام هذا المسجل لتخزين المعطيات في عمليات الدخل والخرج والمقاطعات وبالطبعفأنه يمكن أستخدامه كباقي المسجلات في العمليات الرياضية والمنطقية وكما المسجلاتالأخرى ينقسم هذا المسجل الى قسمين بطول 8 بت هما DL و DH وهو ضمن مسجل أوسع هو EDX بطول 32بت.


[2]
مسجلات الأقسام Segment Registers :-
------------------------------------------------------
كانت العنونةالحقيقية في معالجات ال16بت تتم بأستخدام خطوط عرض 20بت وهي تكفي لعنونة 1ميجابايتمن الرام فقط ولصعوبة التأشير للرام بأستخدام مسجلات من 16بت نشأت فكرة الأقساموالعنونة المنطقية وقد قسمت الرام لمقاطع كل منها بطول 64كيلوبايت(الحد الأقصى الذييمكن عونته ب 16بت) وهذه الأقسام لايبدأ كل واحد فيها بعد الآخر وأنما هي متداخلةحيث يبدأ كل 16بت قسم جديد وللتأشير على موقع ما يلزمنا عنوان المقطع والذي بطول 16بت بالأضافة الى قيمة الأزاحة من بداية هذا المقطع وهي بطول 16بت أيضاً لذلك لجأمصمموا المعالح على وضع مسجلات خاصة بالأقسام الشائعة في البرنامج وهي قسم الشفرة Code Segment وقسم البيانات Data segment وقسم المكدسه Stack Segment وقسم المقطعالأضافي Extra Segment وبالرغم أنه في معالجات ال32بت يمكن العنونة بأستخدام 32بتذاكره حقيقية أي مايساوي 4جيجابايت من الرام الا أن طريقة الأقسام مازالت موجودةحتى يتم خزن عنواين كثيرة بأستخدام 2بايت بدل 4بايت داخل المقطع الواحد مع وجودعنوان مقطع واحد فقط مخزن قي المسجل المناسب .(ملاحظة : تم في معالحات ال32بت أضافةمسجلين أقسام جديدين بطول 16 بت أضافة الى مسجلات الأقسام السابقة والمسجلين هما FS و GS هذان القسمان يمكن أستخدمهما كما المسجل ES كمسجل قسم بيانات أضافي )

قسم الشفرةCode Segment -CS: -
-----------------------------------------------
يحمل هذا المسجل عنوانبداية القسم الخاص بالشفرة في البرنامج .

قسم البيانات Data Segment -DS :-
-----------------------------------------------
يحمل هذا المسجل عنوانبداية قسم البيانات في البرنامج .

قسم المكدسة Stack Segment -CS :-
------------------------------------------------
يحمل هذا المسجل عنوانبداية قسم المكدسه في البرنامج .

قسم الأضافي Extra Segment -ES :-
----------------------------------------------
يحمل هذا المسجل عنوانبداية قسم أضافي يمكن أن يستعمل هذا القسم الأضافي كقسم بياناتآخر.

[3]
مسجلات التأشير Pointer Registers :-
------------------------------------------------------
تحتوي مسجلاتالتأشير وهي بطول 16بت على عنوان من 16 بت وهي تستخدم بشكل خاص مع العمليات الخاصةبالمكدسه وعادة تشكل العنواين التي بها الأزاحة بالنسبة لمسجل قسم المكدسة SS ومسجلات التأشير هي مسجلان مسجل مؤشر القاعدة Base Pointer BP و مسجل مؤشر المكدسه Stack Pointer SP .

مسجل مؤشر القاعدة Base Pointer -BP :-
-----------------------------------------------------
يعمل هذا المسجلعلى تسهيل الوصول الى الوسيطات(البارمترات) والتي تحتوي على عنواين ومعطيات والتيدفعت PUSH بشكل مؤقت الى المكدسه عند أستدعاء روتيمات فرعية من البرامج مع وسيطاتممرة ، وسع هذا المسجل في معالجات ال32بت وأصبح جزء من مسجل أوسع بطول 32بت هو EBP.


مسجل مؤشر المكدسه Stack Pointer -SP :-
------------------------------------------------------
يحتوي المسجل SP على كلمة الذاكرة الحاليه التي ستعالج في المكدس ، وسع هذا المسجل في معالجاتال32بت ليصبح جزء من مسجل أوسع بطول 32بت هو ESP . هذا المسجل يعدل آلياً بواسطةالمعالج مع عملية دفع PUSH أو سحب POP في المكدس ليشير دوماً الى قمة المكدس .

[4]
المسجلات الدليلية Index Registers :-
----------------------------------------------------
هي مسجلات بطول 16بت تستخدم في عنونة بيتات مقطع البيانات وكذلك في عمليات التأشير الى السلاسلالنصية Strings ، وهناك مسجلات دليليان هما SI و DI وعادة مايستخدمان معاً دائماًبغيه تنفيذ عملية ما .

المسجل الدليلي المصدري Source Index -SI :-
--------------------------------------------------------
يستخدم هذاالمسجل في التأشير على النص المصدر وذلك لأجراء العمليات التي تتعامل مع نصوص وكذلكيستخدم في في عنونة بيتات مقطع البيانات ،وسع هذا المسجل في معالجات ال32بت ليصبحجزء من مسجل أوسع بطول 32بت هو ESI .

المسجل الدليلي الهدفي Destination Index -DI :-
------------------------------------------------------------
يستخدم هذاالمسجل في التأشير على النص الهدف وذلك لأجراء العمليات التي تتعامل مع نصوص وكذلكيستخدم في في عنونة بيتات مقطع البيانات ،وسع هذا المسجل في معالجات ال32بت ليصبحجزء من مسجل أوسع بطول 32بت هو EDI .

[5]
مسجلات الحالة والتحكم Status and Control Registers :-
-----------------------------------------------------------------------------
تتكونهذه المسجلات من مسجلين كل بطول 16بت هما مسجل الأعلام Flags Register ومسجل مؤشرالتعليمية Instruction Pointer - IP .

مسجل مؤشر التعليمية Instruction Pointer - IP :-
--------------------------------------------------------------
يحتويالمسجل IP على أزاحة التعليمية التالية التي ستنفذ ، أي أن المسجل عبارة عن مؤشرالى التعليمية التالية الموجودة في مقطع الشفرة CS-Code Segment المنفذ حالياً ،وسعهذا المسجل في معالجات ال32بت ليصبح جزء من مسجل أوسع بطول 32بت هو EIP.
وماتعليمات القفز والتكرار الى تعديل للمسجل IP .

مسجل الأعلام Flags Register :-
------------------------------------------
وهو مسجل بطول 16بت يحتوي علىأعلام طول كل منها 1بت فقط وتستخدم لتعكس حالة آخر عملية أو للتحكم بعمليات معينهوكل علم له موقع معين في ال 16 بت علماً بأن 9 فقط منها محجوزة والباقي غير معرفةوليس عليك حفظ مواقع هذه الأعلام لأنك سستعامل معها بالرمز الذي يرمز لها وكل علمله رمز مكون من حرف واحد فقط يدل عليه ويتبعه أحياناً الحرف F أختصار FLAG للتوضيحأنه علم ، كل علم أما يكون واحد أي SET أو صفر أي CLEAR .



مخطط 4_3 : هذا المخطط يوضح مسجل الأعلام الذي طولة ال 16بت




وهناك نوعين من الأعلام هي أعلام الحالة Status Flags وأعلام التحكم Control Flags .

#
أعلام التحكم Control Flags :-
-----------------------------------------
وهي أعلام مخصصة لضبط قيمتهامن قبل المبرمج أو العتاد ويتم ضبطها عند القيام بالمقاطعات أو أستدعاء البرامجالفرعية أو بعض الأوامر بهدف التحكم بشئ ما وهذه الأعلام هي :

1.
علمالأتجاه (DF=direction flag) : -
-----------------------------------------------
يؤثر في التعليمات التيتقوم بنقل البيانات مثل MOVS,CMPS,SCAS. عندما يكون العلم 1=UP يأخذ الأنتقال أتجاهالطبيعي أما عندما يكون 0=DOWN يأخذ أنتقال البيانات أتجاه معاكساً ( قيمة العلم DF عند بداية البرنامج =1). لضبط العلم بواحد نستخدم التعليمة std ولضبطه بصفر cld .


2.
علم المقاطعه (if=intrreupt flag) : -
-------------------------------------------------
يحدد هذا العلم اذاماكان بمقدور النظام أجراء مقاطعات أو لا ، ويضبط هذا العلم بواسطة أجهزة الهاردويروكذلك وقت النظام ، تستطيع أنت ضبطه أو تصفيره اذا كنت تريد حدوث مقاطعات خارجية أولا ، اذا كانت قيمة العلم=1 فهذا يعني مفعل enable ويمكن أجراء المقاطعات أما اذاكان صفر فأنه غير-مفعل disabled ولايمكن أجراء المقاطعات ( قيمة العلم IF عند بدايةالبرنامج =1). لضبط العلم بواحد نستخدم sti ضبطه بصفر CLI .


3.
علمالمصيدة (tf=trap flag) : -
------------------------------------------
يتيحهذا العلم وضع المعالج في نمط الخطوة الواحدة في الوقت الوحد (single step mode) مما يسمح لبرامج فحص الأخطاء كالديبغر بتتبع البرنامج ، اذا كانت قيمة العلمواحد=ON فأن النمط يعمل أما اذا كان صفر=off فأن النمط لايعمل ( قيمة العلم TF عندبداية البرنامج =0) .

#
أعلام الحالة Status Flags :-
---------------------------------------
هذه الأعلام تضبط آلياً بعد كلعملية رياضية أو منطقية وهي تعكس هذه العملية ، ويمكن بعد العملية التحقق من قيمهذه الأعلام لتنفيذ عمليات مثل الشروط والحلقات وهذه الأعلام هي :

1.
علمالحمل (cf=carry flag) : -
----------------------------------------
يضبطهذا العلم=1 اذا كان نتيجة آخر عملية كبيرة جداً على الهدف أو المقصد (في الأعدادالتي بدون أشارة فقط ) ، مثال هذا البرنامج :

mov ah,200
add ah,100

بما أن المسجل AH هو 8بت فأن أقصى قيمة يتحملها هي 256 وبما أن القيمة فيالمسجل هي 200 ثم أضفنا لها 100 فأن الجواب أكبر من الهدف (aH هنا) لذلك العلم CF سوف يضبط=1 بعد عملية الجمعلضبط لعلم برمجياً stc ولتصفيره clc

2.
علمالفيض (OF=overflow flag) : -
----------------------------------------------
هو نفس علم الحمل لكن معالعمليات ذي الأشارة أي أنه يضبط اذا كان ناتج آخر عملية أكبر أو أصغر من حدودالهدف ، مثال :

mov ah,-100
add ah,-50

بما أن أصغر قيمةيتحملها المسجل AH هي -128 لكن ناتج العملية -150 فأن علم الفيض يضبط=1

3.
علم الأشارة (sf=sign flag) : -
-------------------------------------------
يضبط هذا العلم اذا كان ناتجآخر عملية رياضية أو منطقية سالب ويصفر اذا موجب (في الواقع أن العلم نسخة من البتالأخيرة للجواب( بت الأشارة) - كما ذكرنا سابقاً فأن العدد سالب اذا البت الأخيرة 1وموجب اذا صفر ) .

4.
علم الصفر(zf=zero flag) : -
-------------------------------------
يضبط هذا العلم=1 اذا كانت نتيجةآخر عملية رياضية أو منطقية تساوي صفر .

5.
علم الحمل المساعد(af=auxiliary carry flag) : -
---------------------------------------------------------------
يضبطالعلم=1 اذا تسببت آخر عملية رياضية أو منطقية حمل من البت الثالثة الى البتالرابعة أو أستلاف من البت الرابعه الى البت الثالثه . هذا العلم لاتوجد له فائدةواضحةوهو قليل الأستخدام برمجياً .

6.
علم الأزدواجية - التحقق (pf=parity flag) : -
-----------------------------------------------------------
ببساطةيضبط=1 هذا العلم اذا كان عدد الوحايد في ناتج آخر عملية رياضية أو منطقية زوجياًوبصفر اذا كان فردياً ، مثال لو كان جواب آخر عملية = 00100010 فأن العلم سوفيضبط=1 لأن عدد البتات التي تحتوي وحايد =2 وهو عدد زوجي أما اذا كان الجواب مثلاً = 11100000 فأن العلم يصفر لأن عدد البتات التي تحوي وحايد=3 وهو عدد فردي . وكماعلم الحمل المساعد AF فأن أستعمالة قليل برمجياً ويستخدم عادة من قبل نظام التشغيللأدارة الذاكرة وكذلك برامج الأتصال لتحقق من سلامة البيانات المرسلة .

لاحط أن كل من الأعلام [علم المصيدة (tf=trap flag)/علم الفيض (OF=overflow flag)/علم الأشارة (sf=sign flag)/علم الصفر(zf=zero flag)/علم الحملالمساعد(af=auxiliary carry flag)/علم الأزدواجية - التحقق (pf=parity flag)] لايوجد لهم تعليمات مباشرة لضبطهم أو تصفيرهم وتحتاج أن تستخدم طريق فيها أنحناءةبسيطة لتعديل قيم هذه الأعلام سوف يتم شرحها في دروس قادمة علماً بأن البرامجالعادية لن تحتاج لتعديل قيم هذه الأعلام وكل ماستحتاجه هو قرآة القيم التي بها .

إلى هنا ينتهى الدرس الثالث ، ونبدأ من الدرس الرابع إن شاء الله تعليماتلغة الأسمبلى ( البدايه الفعليه ) ، نشكركم لحسن إستماعكم معنا ، رجاء الإهتمامالتام بهذه الدروس الثلاثه السابقه لأهميتها الشديده

من انا ؟