دورة الأسمبلى - اليوم الثالث

كما ذكر من قبل أن لغة الأسمبلى تتعامل مع الهارد وير ،
كيف هذا ؟
وما معنى هذا ؟



سأسرد كيفية التعامل العامه مع الهاردوير عاماً :-
----------------------------------------------------
البيانات المخزنه أو التى يتعامل معها أى جزء من أجزاء الهارد وير تنقسم إلى قسمين :-
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)] لايوجد لهم تعليمات مباشرة لضبطهم أو تصفيرهم وتحتاج أن تستخدم طريق فيها أنحناءة بسيطة لتعديل قيم هذه الأعلام سوف يتم شرحها في دروس قادمة علماً بأن البرامج العادية لن تحتاج لتعديل قيم هذه الأعلام وكل ماستحتاجه هو قرآة القيم التي بها .

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

 

 

 


Copyright © www.kettaneh.net