| لغة التجميع و المعالجات الدقيقة | |
|
|
|
كاتب الموضوع | رسالة |
---|
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:12 am | |
|
| المستودع
| المصدر
| مسجل عام | مسجل مقطع | متغير (موقع في الذاكرة) | ثابت | مسجل عام | مسموح | مسموح | مسموح | غير مسموح | مسجل مقطع | مسموح | غير مسموح | مسموح | غير مسموح | متغير ( موقع في الذاكرة) | مسموح | مسموح | غير مسموح | غير مسموح | ثابت | مسموح | غير مسموح | مسموح | غير مسموح |
2- الأمر XCHG (Exchange)
يستخدم الأمرXCHG لاستبدال قيمة مسجلين أو لاستبدال قيمة مسجل مع موقع محدد في الذاكرة (متغير). والصيغة العامة للأمر هي: XCHG Destination, Source
مثال:
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:15 am | |
|
حيث يتم تبادل قيم المسجلين AH, BL (تصبح قيمة AH تساوى قيمةBL وBL تساوى AH).
مثال:
الأمر التالي يقوم باستبدال قيمة المسجل AX مع المتغير WORD1
XCHG AX, WORD1
الجدول التالي يوضح قيود استخدام الأمر XCHG
لاحظ عدم السماح للتعليمتين MOV أو XCHG بالتعامل مع موقعين في الذاكرة في أمر واحد مثل MOV Word1,Word2
ولكن يمكن تفادي هذا القيد باستخدام مسجل وسيط فيصبح الأمر كما يلي:
Mov AX , Word2
Mov Word1 , AX
|
| المستودع
| المصدر | مسجل عام | موقع في الذاكرة | مسجل عام | مسموح | مسموح | موقع في الذاكرة | مسموح | غير مسموح |
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:16 am | |
|
3 - العمليات الحسابية ADD, SUB, INC, DEC, NEG:
يتم استخدام الأمرين ADD و SUB لجمع أو طرح محتويات مسجلين أو مسجل وموقع في الذاكرة أو موقع في الذاكرة مع مسجل أو مسجل مع موقع في الذاكرة والصيغة العامة للأمرين هي:- ADD Destination, Source
SUB Destination, Source مثلاً الأمر
ADD WORD1, AX
يقوم بجمع محتويات المسجل AX إلي قيمة المتغير WORD1 ويتم تخزين النتيجة في المتغير WORD1 (لا يتم تغيير قيمة محتويات المسجل AX بعد تنفيذ الأمر) كذلك الأمر SUB AX, DX
حيث يتم طرح محتويات المسجل DX من المسجل AX ويتم تخزين النتيجة في المسجل AX (لاحظ أن محتويات المسجل DX لا تتغير بعد تنفيذ الأمر)
الجدول التالي يبين قيود استعمال الأمرين ADD و SUB | المستودع
| المصدر | مسجل عام | موقع في الذاكرة | مسجل عام | مسموح | مسموح | موقع في الذاكرة | مسموح | غير مسموح |
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:17 am | |
|
لاحظ أنه غير مسموح بالجمع أو الطرح المباشر بين مواقع في الذاكرة في أمر واحد وبالتالي فإن الأمر ADD BYTE1, BYTE2 غير مسموح به ولكن يمكن إعادة كتابته على الصورة: MOV AL, BYTE2 ; حيث يتم قيمة المتغير إلى مسجل قبل عملية الجمع
ADD BYTE1, AL
الأمر ADD BL,5 يقوم بجمع الرقم 5 إلى محتويات المسجل BL وتخزين النتيجة في المسجل BL.
كملاحظة عامه نجد انه يجب أن يكون المتغيرين لهما نفس الطول بمعني أن الأمر التالي غير مقبول MOV AX ,BYTE1
وذلك لأن طول المتغير BYTE هو خانه واحدة أما المسجل AX فان طوله هو خانتين 2-BYTE. (أي أن المتغيرات (المعاملات) يجب أن تكون من نفس النوع )
بيــنما نجــد الـ ASEMBLER يستـقبل الأمر
MOV AH, ‘A’ ( مادام AH بايت فإن المصدر يجب أن يكون كذلك بايت )
حيث يتم وضع الرقم 41h في المسجلAH ويقوم أيضا بتقبل الأمر
MOV AX ,’A’ ( مادام AX كلمة فإن المصدر يجب أن يكون كذلك كلمة )
حيـث سيــتم وضــع الرقــم0041h في المسجـل AX.
الأوامر INC (Increment) , DEC (Decrement) , NEG
أما الأمرين INC ,DEC يتم فيها زيادة أو نقصان قيمه مسجل أو موقع في الذاكرة بمقدار 1 والصيـغة العامة لها هي:
INC Destination ; Destination = Destination +1
DEC Destination ; Destination = Destination - 1
فمـثلا الأمرINC WORD1 يقـوم بجمع 1 إلى محتويات المتغيـرWORD1
بيـنما الأمرDEC WORD2 يـقوم بإنقاص الرقم 1 مـن محتويات المتغيـرWORD2.
أخيراً نتحدث عن الأمرNEG(Negate) والذي يستعمل لتحويــل إشارة الرقم الموجب إلي رقم سالب والـرقم السالب يـتم تحويـله إلي رقم موجب وذلك بتحويـــله إلى المكمل لاثنين Complement 2’S والصيغة العامة للأمر هي:
NEG Destination
حيـث يتـم التعـامل مـع أحد المسجلات أو مـوقع في الذاكرة
مثـــال:
NEG BX ; BX = -BX
NEG BYTE ; BYTE = -BYTE. | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:18 am | |
| [b][u]تحويل العبارات إلي صورة برامج التجميع:-
لكي يتم التعامل مع الأوامر السابقة سنقوم في هذا الجزء بتحويل بعض العمليات من لغات البرمجة العليا High Level Programming Languages إلي تعليمات بلغة التجميع.
إذا افترضنا أن المتغيرين A و B عبارة عن متغيرين من النوع WORD.
لتحويل العبارة B=A
لأنه لا يمكن نقل محتويات لمتغير في الذاكرة إلي متغير آخر في الذاكرة مباشرةً يلزم تحويل العبارة إلي نقل قيمة المتغير إلي مسجل ثم نقل قيمة المسجل إلي الرقم المطلوب
انقل محتويات A الي المسجل AX قبل نقلها الى B MOV AX , A
MOV B , AX
أما الأمر A= 5 - A يتم تحويلة إلى الأوامر
ضع 5 في AX MOV AX , 5
AX تحتوي علي 5-A SUB AX , A
ضعها في A MOV A , AX
أو إلى الأوامر NEG A
ADD A,5
وأخيراً الأمر A=B-2*A يتم تحويلة إلى الأوامر MOV AX,B
SUB AX,A
SUB AX, A
MOV A,AX [b]الشكل العام للبرنامج:-
في الفصل السابق قمنا بتوضيح عملية تقسيم الذاكرة إلى مقاطع مختلفة بحيث يحتوى المقطع الأول علي البرنامج نفسه ويسمى مقطع البرنامج CODE SEGMENT ومقطع آخر يحتوى علي البيانات المستخدمة في البرنامج ويسمى مقطع البيانات DATA SEGMENT ومقطع ثالث يحتوي علي المكدس ويسمى مقطع المكدس STACK SEGMENT
في هذا الجزء سيتم توضيح كيفية توليد هذه المقاطع بواسطة الـ ASSEMBLER مع توضيح كيفية كتابة وتعريف كل مقطع داخل البرنامج.
نماذج الذاكرة MEMORY MODELS:
كما ذكرنا فيما مضى انه قد يكون البرنامج المطلوب كتابته صغير بحيث يمكن أن يسع مقطع واحد فقط لكل من البرنامج والبيانات والمكدس وقد تحتاج إلي استخدام مقطع منفصل لكل على حده. يتم استعمال الكلمة.MODEL وذلك بكتابة السطر التالي:
.MODEL MEMORY_MODEL
ويتم كتابة هذا السطر قبل تعريف أي نقطة ويوجد لدينا اكثر من نموذج للذاكرة سوف يتم توضيحها في الجدول التالي ولكن عموماً إذا لم يكن حجم البيانات كبيراً يتم غالباً استخدام النموذج SMALL وهذا هو الحال في اغلب البرامج التي سنتطرق لها. ويتم كتابة السطر على الصورة التالية:.MODEL SMALL[/b]
[/b]
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:20 am | |
|
الجدول التالي يوضح أسماء موديلات الذاكرة المختلفة وتوضيح خصائص كل منها
الموديل MODEL | الوصف | SMALL | الكود في مقطع واحد والبيانات في مقطع واحد | MEDIUM | الكود في أكثر من مقطع والبيانات في مقطع واحد | COMPACT | الكود في مقطع واحد والبيانات في أكثر من مقطع | LARGE | الكود في أكثر من مقطع والبيانات في أكثر من مقطع ولكن غير مسموح بتعريف مصفوف اكبر من 64k BYTE | HUGE | الكود في أكثر من مقطع والبيانات في أكثر من مقطع ولكن يمكن أن يكون هناك مصفوف بطول اكبر من 64k BYTE |
مقطع البيانات DATA SEGMENT:
يحتوى مقطع البيانات على تعريف كل المتغيرات وبالنسبة للثوابت يمكن تعريفها في في مقطع البيانات أو في أي مكان آخر نسبة لأنها لا تشغل مكان في الذاكرة.
لتعريف مقطع البيانات يتم استخدام التعريف.DATA وبعد ذلك يتم تعريف المتغيرات والثوابت مباشرة والمثال التالي يوضح ذلك
.DATA
WORD1 DW 2
WORD2 DW 5
MSG DB ‘THIS IS A MESSAGE’
MASK EQU 10011001B
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:21 am | |
|
مقطع المكدس Stack Segment:
الغرض من مقطع المكدس هو حجز جزء من الذاكرة ليتم استخدامه في عملية تكديس البيانات أثناء تنفيذ البرنامج. ويجب أن يكون هذا الحجم كافي لتخزين كل المكدس في أقصي حالاته (لتخزين كل القيم المطلوب تكديسها أثناء عمل البرنامج ).
ويتم تعريف مقطع المكدس باستخدام التعريف:.Stack Size
حيث size يمثل عدداً اختيارياً هو حجم المكدس بالوحدات bytes. والمثال التالي يقوم بتعريف المكدس بحجم 100h
.Stack 100h
إذا لم يتم تعريف الحجم يتم افتراض الحجم 1KB بواسطة الـ Assembler.
مقطـــــع البرنامج Code Segment:
يحتوى هذا المقطع على الأوامر والتعليمات المستخدمة داخل البرنامج ويتم تعريفه على النحو التالي:
.Code Name
حيث Name هـــو اسم المقطع.ولا داعي لإعطاء اسم للمقطع في حالة النموذج Small (لان لدينا مقطع واحد فقط ) حيث سيقوم برنامج الـ Assembly بإعطاء رسالة خطأ في هذه الحالة.
داخل مقطع البرنامج يتم وضع الأوامر في صورة برامج صغيــرة (إجراءات ) Procedure وأبسط تعريف لهذه الإجراءات على النحو التالي
Name Proc
; الأوامر والتعليمات داخل الإجراء
Name ENDP
حيث Name هو اسم الإجراء، أما Proc و Endp فهما إيعازات Pseudo_Ops
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:22 am | |
| [b]الجزء التالي يوضح مقطع برنامج كامل
.CODE
MAIN PROC
; الأوامر والتعليمات داخل الإجراء
MAIN ENDP
; بقية الإجراءات يتـــم كتابتهـــا هـــــنا
والآن بعد أن رأينا كل مقاطع البرنامج فان الشكل العام للبرنامج في حالة النموذج small. يكون على النحو التالي:
.MODEL SMALL
.STACK 100H
.DATA
; هنا يكون تعريف المتغيرات والثوابت
.CODE
MAIN PROC
; التعليمات والأوامر داخل الإجراء
MAINENDP
;بقية الإجراءات تكتب هنا
END MAIN
آخر سطر في البرنامج يحوى كلمة نهاية البرنامج ENDمتبوعة باسم الإجراء الرئيسي في البرنامج.
تعليمات الإدخال والإخراج INPUT &OUTPUT INSTRUCTIONS
يتعامل المعالج الدقيق مع الأجهزة الخارجية باستخدام موانئ الإدخال والإخراج وذلك باستخدام الأوامر IN للقراءة وفى ميناء إدخال والأوامر OUT للكتابة في ميناء إخراج. ويتم استخدام هذه الأوامر في بعض الأحيان بالذات إذا كان المطلوب هو سرعة التعامل مع الجهاز الخارجي وعادة لا يتم استخدام هذه الأوامر في البرامج التطبيقية لسببين الأول أن عناوين الموانئ قد تختلف من جهاز لآخر مما يتطلب تعديل البرنامج في كل مرة, والثاني انه من الأسهل التعامل مع الأجهزة الخارجية بواسطة الشركات المصنعة للأجهزة بواسطة روتينات خدمة SERVICE ROUTINES يتم توفيرها بواسطة الشركات المصنعة للأجهزة.يوجد نوعان في روتينات الخدمة المستخدمة في التعامل مع الموانئ يسمى الأول BIOS (BASIC INPUT /OUTPUT SYSTEM ) والثاني باستخدام الـ DOS. روتينات الـ BIOS يتم تخزينها في ذاكرة القراءة فقط (الـ ROM ) ويتعامل مباشرة مع موانئ
[/b]
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:24 am | |
|
الإدخال والإخراج بينما خدمات الـ DOS تقوم بتنفيذ عمليات أكثر تعقيداً مثلاً طباعة سلسلة حروف وهي تقوم عادة باستخدام الـ BIOS في تنفيذ عمليات إدخال/إخراج مباشرة.
يتم نداء الـ BIOS أو الـ DOS لتنفيذ عملية محددة باستخدام نداء مقاطعة INT (INTERRUPT ) والنداء على هذه الصورة
INT INTERRUPT_NUMBER
حيث يتم تحديد رقم نداء المقاطعة وهو رقم محدد مثلاً INT 16h يقوم بطلب خدمة في الـ BIOS وهى خاصة بقراءة قيمة في لوحة المفاتيح و INT 21h خاص بنداء خدمة من الـ DOS سيتم التعرف على مزيد من الخدمات لاحقاً بإذن الله
نداء المقاطع رقم 21H ( INT 21H )
يتم استخدام هذا النداء لتنفيذ مجموعة كبيرة من الخدمات التي يقدمها نظام التشغيل DOS حيث يتم وضع رقم الخدمة المطلوبة في المسجل AH وقد يتطلب الأمر وضع بعض القيم في مسجلات أخرى وذلك حسب نوع الخدمة المطلوبة وبعد ذلك يتم نداء طلب المقاطعة 21H. وقد يتطلب الأمر استقبال قيم محددة في نداء المقاطعة حيث يتم وضعها في المسجلات. يتم وضع الخدمات المختلفة في جدول كبير يوضح وظيفة كل خدمة والمدخلات إليها والمخرجات منها.
الجدول التالي يوضح ثلاثة فقط من الخدمات التي يخدمها النظامرقم الخدمة
| الوصف ( الروتين ) | 1 | قراءة قيمة واحدة من لوحة المفاتيح | 2 | كتابة حرف واحد في الشاشة | 9 | كتابة مجموعة من الحروف في الشاشة |
في الجزء التالي ستناول بعض هذه الخدمات
الخدمة رقم 1: قراءة حرف من لوحة المفاتيح
المدخلات: وضع الرقم 1 في المسجلAH
المخرجات: المسجل AL يحتوي علي كود ال ASCII للحرف الذي تم الضغط عليه في لوحة
المفاتيح أو 0 في حالة الضغط على مفتاح غير حرفي NON CHARACHTER KEY
) مثلا المفاتيح F1-F10 ).
لتنفيذ هذه الخدمة تتم كتابة الآتي:- MOV AH, 01
INT 21H
تقوم هذه الخدمة بانتظار المستخدم إلى حين الضغط على لوحة المفاتيح. عند الضغط على أي مفتاح يتم الحصول على كود الـ ASCII للمفتاح من المسجل AL كما يتم عرض الحرف الذي تم الضغط عليه في لوحة المفاتيح علي الشاشة. ولا تقوم هذه الخدمة بإرسال رسالة إلي المستخدم فهي فقط تنتظر حتى يتم الضغط على مفتاح. إذا تم ضغط بعض المفاتيح الخاصة مثل F1-F10 فسوف يحتوي المسجل AL | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:24 am | |
|
علي القيمة صفر. التعليمات التي تلي INT 21h تستطيع فحص المسجل AL و تتخذ الفعل المناسب.
2 - الخدمة رقم 2: عرض حرف على الشاشة أو تنفيذ وظيفة تحكم.
المدخلات : وضع الرقم 02 في المسجل AH.
وضع شفرة الـ ASCII كود للحرف المطلوب عرضه في المسجل DL.
المخرجات : الكود الـ ASCII للحرف الذي تم عرضه يتم وضعه في المسجل AL.
مثال: الأوامر التالية تعرض علامة استفهام علي الشاشة
MOV AH , 02H
MOV DL , ‘?’
INT 21H
بعد طباعة الحرف على الشاشة يتحرك المؤشر إلي الموضع التالي ( إذا كان الوضع الحالي هو نهاية السطر يتحرك المؤشر إلي بداية السطر الجديد).
يتم استخدام هذه الخدمة لطباعة حرف التحكم Control Character أيضاً والجدول التالي يوضح بعض حروف التحكم) الكود ASCII | الــرمـــز | الوظيـفة | 7 | BEL (Beep) | إصدار صوت | 8 | BS (Back space) | مسافة للخلف Back Space ) ) | 9 | HT (Tab) | تحرك بمقدار Tab | A | LF (Line Feed) | سطر جديد | D | CR (Carriage return) | بداية السطر الحالي |
بعد التنفيذ يحصل المسجل AL علي شفرة ASCII لحرف التحكم
البرنامج الأول:
برنامجنا الأول سيقوم بقراءة حرف من لوحة المفاتيح ثم طباعة الحرف الذي تم إدخاله في بداية السطر التالي ثم إنهاء البرنامج.
يتكون البرنامج من الأجزاء التالية:
1- إظهار علامة الاستفهام "؟" على الشاشة
MOV AH,2
MOV DL,’?’
INT 21h
2- قراءة حرف من لوحة المفاتيح
MOV AH,1
INT 21h
3- حفظ الحرف الذي تم إدخاله في مسجل آخر BL مثلاً و ذلك لأننا سنستخدم المسجل DL في تحريك المؤشر إلي بداية السطر الجديد وسيؤدي ذلك لتغيير محتويات المسجل AL ( لاحظ أن الخدمة 2 تقوم باستقبال الحرف المطلوب طباعته في المسجل DL وتقوم بإعادة الحرف المطبوع في المسجل AL مما يجعلنا نفقد القيمة المسجلة فيه) وبالتالي يجب تخزين محتوياته في مسجل آخر مثل BL
MOV BL , AL
4- لتحريك المسجل إلي بداية السطر الجديد يجب طباعة حرف التحكم
Carriage Return و Line Feed ويتم ذلك كالآتي
MOV AH,2
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:26 am | |
|
MOV DL,0dh ; Carriage Return
INT 21h
MOV DL,0ah ; Line Feed
INT 21h
5- طباعة الحرف الذي تم إدخاله (لاحظ انه تم تخزينه في المسجل BL في الخطوة (3)
MOV DL , BL
INT 21h
6- إنهاء البرنامج و العودة الى نظام التشغيل ويتم ذلك بوضع الرقم 4Ch في المسجل AH
واستدعاء نداء المقاطعة رقم 21h.
MOV AH,4CH
INT 21h
و على ذلك يصبح البرنامج على الصورة التالية:
TITLE FIRST: ECHO PROGRAM
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
;اظهار علامة التعجب
MOV AH,2 ; طباعة حرف
MOV DL,’?’ ; الحرف المطلوب طباعته
INT 21H
;قراءة حرف من لوحة المفاتيح
MOV AH,01 ; قراءة حرف
INT 21H
MOV BL,AL ; تخزين الحرف
; الذهاب إلى سطر جديد
MOV AH,02
MOV DL,0DH ; carriage return
INT 21H
MOV DL,0AH ; line feed
INT 21H
; طباعة الحرف الذي تم إدخاله
MOV DL,BL ; ; إحضار الحرف من المسجل
INT 21H
; DOS العودة إلى نظام التشغيل
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
لاحظ أنه عندما يتوقف البرنامج فإنه يحول التحكم للـ DOS بتنفيذ INT 21h الوظيفة 4Ch
ولأنه لم يتم استخدام المتغيرات فقد حذف قطاع البيانات في هذا البرنامج
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:27 am | |
|
إنشاء وتشغيل البرنامج:-
في هذا الجزء سنوضح طريقة إنشاء و تجهيز البرنامج للتشغيل حيث يتضمن ذلك الخطوات التالية:-
1- استخدام أي برنامج Text Editor لكتابة البرنامج الموضح في المثال السابق. (ملف برنامج المصدر)
2- استخدام الـ ASSEMBLER لتوليد الملف المسمى OBJECT FILE.
3- استخدام برنامج الربط LINKER لربط ملفات الـ OBJECTلتوليد ملف التشغيل
EXECUTABLE FILE.
4- تشغيل البرنامج.
فيما يلي توضيح بالتفصيل كل خطوة من الخطوات السابقة:-
1- إنشاء ملف البرامجSOURCE FILE:-
يتم استخدام أي محرر نصوص Editor لكتابة البرنامج ويمكن استخدام أي محرر ينتج ملف نصي عادى Text Editor مثل EDIT يتم عادة تخزين الملف بامتداد ASM (Extention) مثلا المثال السابق نحفظ الملف بالاسم FIRST.ASM.
2- تجميع البرنامجASSEMBLE THE PROGRAM:-
ويتم هذا عن طريق معالجة البرنامج بواسطة أحد الـ Assembler مثلMASM(Microsoft Macro Assembler) أو TASM(Turbo Assembler) و التي تقوم بتحويل الملف الأصلي الذي يحتوى على البرنامج المكتوبة بلغة التجميع إلى ملف اقرب إلى لغة الآلة يسمى(OBJECT FILE). وأثناء هذه العملية يتم التعامل مع الملف والتأكد من عدم وجود أي خطأ في كتابة البرنامج حيث يتم الرجوع إلي الخطوة (1) وتحديد الأخطاء و تصحيحها حتى نحصل على رسالة بعدم وجود أخطاء في البرنامج.
واستخدام البرنامج TASM أوMASM يتم على النحو التالي:
TASM FILENAME;
MASM FILENAME; أو
في هذا الجزء سنستخدم برنامج TASM والجزء التالي يوضح هذه العملية:-
>TASM FIRST;
TURBO ASSEMBLER VERSION 3.1 COPYRGHT(C)1988,1992BRLAND INTERNATIONAL
ASSEMBLING FILE: FIRST.SAM
ERROR MESSAGE: NONE
WARNING MESSAGE:NONE
PASSES: 1
السطر الأول يوضح نوع الـASSEMBLER والسطر الثاني يوضح اسم الملف يليه سطرين بالأخطاء التي توجد في البرنامج.
لاحظ أنه إذا كان هناك أي خطأ في البرنامج الأصلي يتم إظهار رسالة تحوي رقم السطر ونبذة سريعة عن الخطأ حيث يجب فتح الملف الأصلي first.asm وتصحيح الخطأ ثم العودة مرة أخرى وإعادة هذه الخطوة حتى نحصل على الملف first.obj.
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:28 am | |
|
-ربط البرنامج Linking the program
الملف الذي تم إنشاؤه في الخطوة السابقة هو ملف بلغة الآلة Machine Language ولكنه غير قابل للتنفيذ لأنه لا يحتوي على الشكل المناسب للبرامج القابلة للتنفيذ وذلك للأسباب التالية:
أ- عدم تعريف مكان تحميل الملف في الذاكرة وبالتالي فإن عمليه العنونة داخل البرنامج لا يمكن تنفيذها.
ب- بعض الأسماء والعناوين داخل البرنامج تكون غير معرفة بالذات في حالة ربط أكثر من برنامج حيث يتم من أحد البرامج نداء برامج فرعيه أخرى مكتوب في ملف آخر.
برنامج الربط Link Program يقوم بإجراء عملية الربط بين الـ Object Files المختلفة وتحديد العناوين داخل البرنامج ويقوم بعد ذلك بإنتاج ملف قابل للتنفيذ. EXE (Executable File) على النحو التالي:
> TLINK First;
Turbo Link Version 2.0 Copyright (c) 1987 Borland International.
4 – تنفيذ البرنامج Run The Program
لتشغيل البرنامج يتم فقط كتابة اسمه من محث الـDOS
C:\ASM > first
?t
t
C:\ASM >
يقوم البرنامج بطباعة الحرف "؟" والانتظار إلي حين الضغط علي مفتاح من لوحة المفاتيح. يقوم البرنامج بالذهاب إلي بداية السطر الجديد وطباعة الحرف الذي تم الضغط عليه ثم الانتهاء والعودة إلي نظام التشغيل.
إظهار رسالة علي الشاشة Display String
في البرنامج السابق تم استخدام الوظيفة رقم 1 من نداء المقاطعة رقم 21h وهي تستخدم لاستقبال حرف من لوحة المفاتيح وكذلك الوظيفة رقم 2 وهي لطباعة حرف علي الشاشة.
في هذا المثال ولإظهار رسالة كاملة علي الشاشة يتم استخدام الخدمة رقم 9 خدمة رقم 9 : إظهار رسالة علي الشاشة
المدخلات : عنوان الإزاحة Offset لبداية الرسالة يتم وضعه في المسجل DX
( يجب أن تنتهي الرسالة بالحرف "$" )
الحرف "$" في نهاية الرسالة لا تتم طباعته علي الشاشة. وإذا احتوت الرسالة علي أي حرف تحكم Control Character فإنه يتم تنفيذه أثناء الطباعة.
لتوضيح هذه العملية سنقوم بكتابة برنامج يقوم بإظهار الرسالة ‘Hello!’ في الشاشة. يتم تعريف هذه الرسالة في مقطع البيانات بالطرقة التالية
msg db ‘HELLO!$’
الأمر LEA
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:29 am | |
| تحتاج الخدمة رقم 9 في نداء المقاطعة INT 21h إلي تجهيز عنوان إزاحة الرسالة في المسجل DX ولعمل ذلك يتم تنفيذ الأمر LEA ( Load Effective Address) LEA Destination , Source
حيث المستودع هو أحد المسجلات العامة والمصدر هو اسم المتغير الحرفي (موقع في الذاكرة). يقوم الأمر بوضع عنوان الإزاحة للمتغير المصدر في المسجل المستودع. فمثلاً الأمر LEA DX, MSG
يقوم بوضع قيمة الإزاحة لعنوان المتغير msg في المسجل DX.
ولأن هذا البرنامج يحتوي علي مقطع بيانات فإننا نحتاج إلي تجهيز المسجل DS لكي يشير إلي مقطع البيانات.
بادئة مقطع البرنامج PSP (Program Segment Prefix)
عندما يتم تحميل البرنامج في الذاكرة يقوم نظام التشغيل بتخصيص 256 خانة للبرنامج وهي تسمي PSP. يحتوي الـ PSP علي معلومات عن البرنامج وعلي ذلك يستطيع البرنامج التعامل مع هذه المعلومات. يقوم نظام التشغيل DOS بوضع عنوان المقطع الخاص به في كل من المسجلين DS و ES قبل تنفيذ البرنامج ونتيجة لذلك فإن مسجل مقطع البيانات DS لا يحتوي علي عنوان مقطع البيانات الخاص بالبرنامج ولعلاج هذه المشكلة فإن أي برنامج يحتوي علي مقطع بيانات يجب أن يبدأ بتجهيز مسجل مقطع البيانات ليشير إلي مقطع البيانات الخاص بالبرنامج علي النحو التالي MOV AX, @DATA
MOV DS, AX
حيث @DATA هو عنوان مقطع البيانات الخاص بالبرنامج والمعرف بـ.DATA حيث يقوم الـ ASSEMBLER بتحويل الاسم @DATA إلي رقم يمثل عنوان المقطع ولأننا لا نستطيع تخزين النتيجة في المسجل DS مباشرة فقد استعنا بمسجل عام AX كمسجل وسيط يتم وضع القيمة فيه أولاً وبعد ذلك يتم نقلها إلي المسجل DS.
بعد ذلك يمكن طباعة الرسالة ‘HELLO!’ وذلك عن طريق وضع عنوانها في المسجل DX واستخدام الخدمة رقم 9 في نداء المقاطعة رقم 21h. البرنامج التالي يوضح هذه العملية بالتفصيل
TITLE SECOND: DISPLAY STRING
.MODEL SMALL
.STACK 100H
.DATA
MSG DB 'HELLO!$'
.CODE
MAIN PROC
; initialize DS
MOV AX,@DATA
MOV DS,AX
;display message
LEA DX,MSG ; احصل علي الرسالة
[/size]
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:33 am | |
|
MOV AH,09H ; وظيفة عرض السلسلة
INT 21H
;return to DOS
MOV AH,4CH
INT 21H ; الخروج الي نظام التشغيل
MAIN ENDP
END MAIN
برنامج تحويل حالة الحروف A Case Conversion Program:
في هذا المثال سنقوم بسؤال المستخدم ليقوم بإدخال حرف صغير lower-case letter يقوم البرنامج بإظهار رسالة تطبع الحرف الذي تم إدخاله بعد تحويله إلى صورة حرف كبير upper-case letter مثلاً
Enter A Lower Case Letter: a
In Upper Case It Is: A
سيتم في هذا البرنامج استخدام الإيعاز EQU لتعريف كل من CR,LF
CR EQU 0DH
LF EQU 0AH
بينما يتم تعريف الرسائل على النحو التالي
MSG1 DB ‘Enter A Lower Case Letter:$’
MSG2 DB CR,LF,’ In Upper Case It Is: ‘
Char DB ? ,’$’
عند تعريف المتغير char تم تعريفه بعد الرسالة MSG2 مباشرة وذلك لأن البرنامج سيقوم بإظهار الرسالة msg2 متبوعة مباشرة بالحرف char (وهو الحرف الذي تم إدخاله بعد تحويله إلى Upper -case ويتم ذلك بطريقة طرح الرقم 20h من الحرف الذي تم إدخاله)
تم تعريف حروف التحكم CR,LF قبل الرسالة msg2 بهدف جعل الرسالة تبدأ من بداية السطر الجديد.
ولأن الرسالة msg2 لا تنتهي بعلامة نهاية الرسالة ‘$’ فإنه سيتم الاستمرار في الطباعة وطباعة الحرف char في الشاشة ( لاحظ أن العلامة ‘$’ توجد في نهاية المتغير char مباشرة ).
يبدأ البرنامج بإظهار الرسالة msg1 ثم قراءة الحرف من لوحة المفاتيح
LEA DX ,msg1
MOV AH ,9
INT 21h
MOV AH ,1
INT 21h
بعد ذلك يتم تحويل الحرف إلى حرف كبير upper-case وذلك بطرح العدد 20h من الحرف (وذلك لأن الفرق بين الحروف الكبيرة والصغيرة في جدول ASCII هو العدد20h حيث تبدأ الحروف الكبيرة ابتداءً من 41h بينما تبدأ الحروف الصغيرة ابتداءً من61h ) ويتم تخزين النتيجة في المتغير char
SUB AL,20h ; حوله الي حرف كبير
MOV char ,AL ; ثم خزِنهُ في المتغير
بعد ذلك يقوم البرنامج بإظهار الرسالة الثانية msg2 وتطبع متبوعة بالمتغير char كما ذكرنا سابقاً. وفيما يلي نص البرنامج:
TITLE THIRD: CASE CONVERSION PROGRAM
.MODEL SMALL
.STACK 100H
.DATA
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:34 am | |
|
CR EQU 0DH
LF EQU 0AH
MSG1 DB 'ENTER A LOWER CASE LETTER: $'
MSG2 DB CR,LF,'IN UPPER CASE IT IS:'
CHAR DB ?,'$'
.CODE
MAIN PROC
; initialize DS
MOV AX,@DATA
MOV DS,AX
;print user prompt
LEA DX,MSG1
MOV AH,09H
INT 21H
;input character and convert to lower case
MOV AH,01H
INT 21H
SUB AL,20H
MOV CHAR,AL
;display on the next line
LEA DX,MSG2
MOV AH,09H
INT 21H
;return to DOS
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
تمـــــاريـــــن:-
1- اذكر أي من الأسماء التالية صحيحاً وأيها خطأ في لغة التجميع الخاصة بـ IBM PC ولماذا...؟
1- two_words
2- ?1
3- tow words
4- t=
2- أي من الأرقام التالية صحيح وأيها خطأ. وإذا كانت صحيحة اذكر نوع الرقم ثنائي عشري أو سداسي عشري.
1- 246 2- 246h 3- 1001 4- 1.101
5- 2EAH 6- FFEH 7-1011B
3- أعطِ تعريف كلٍ من المتغيرات التالية ( إذا كان ممكناً)
أ-متغير كلمة word اسمه A وبه قيمة ابتدائية 52.
ب-متغير كلمة word اسمه word1 ولا توجد به قيمة ابتدائية.
جـ-متغير حرف Byte اسمه B وبه قيمة ابتدائية 52.
د-متغير حرف Byte اسمه C ولا توجد به قيمة ابتدائية.
هـ-متغير كلمة word اسمه word2 به قيمة ابتدائية 65536.
و-مصفوفة كلمات اسمها Array1 وضع فيها قيمة ابتدائية
ز-ثابت اسمه Bell يساوي 7.
حـ- ثابت رسالة اسمه msg يساوي ‘This Is A Message $’
4-افترض أن البيانات التالية مخزنة في الذاكرة ابتداءً من الإزاحة 0000h | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:35 am | |
|
A DB 7
B DW 1ABCH
C DB ‘HELLO’
أ-أعطِ عنوان الإزاحة للمتغيرات A,B,C.
ب- وضح محتويات البايت عند الإزاحة 0002h.
جـ- وضح محتويات البايت عند الإزاحة 0004h.
د- وضح عنوان الإزاحة للحرف ‘O’ في كلمة ‘HELLO’.
5- وضح إذا كانت العبارات التالية صحيحة أو خطأ حيث B1,B2 عبارة عن متغيرات حرفية Byte وw1,w2 عبارة متغيرات كلمات words.
1-MOV Ds,Ax 2-MOV Ds,1000h
3- MOV CS,ES 4-MOV w1,DS
5-XCHG w1,w2 6-SUB 5,B1
7-ADD B1,B2 8-ADD AL,256
9-MOV w1,B1
6-استخدم الأوامرMOV, ADD , SUB ,INC , DEC , NEG لترجمة العبارات التالية المكتوبة بلغة راقية إلى عبارات بلغة التجميع:
1- A=B - A
2- A= -(A+1)
3- C= A + B
4- B= 3* B + 7
5- A= B - A- 1
7- اكتب عبارات (وليس برنامج كامل) لتقوم بالآتي:
1-قراءة حرف ثم طباعته في الموضع التالي في الشاشة في نفس السطر.
2- قراءة حرف كبير Upper case letter ثم طباعته في الموضع التالي بنفس السطر في الشاشة وذلك في صورة حرف صغير Lower case letter.
برامج للكتابة:
8- اكتب برنامج يقوم بالآتي:
1- طباعة العلامة ‘?’.
2- يقوم بقراءة رقمين عشريين مجموعهما أقل من العدد 10
3-يقوم البرنامج بحساب مجموع العددين وطباعة النتيجة في السطر التالي.
مثال للتنفيذ
? 35
The sum of 3 and 5 is 8
9- اكتب برنامج يقوم بطلب كتابة ثلاثة حروف. يقوم البرنامج بقراءة الحروف الثلاثة وطباعتها كل حرف في سطر منفصل.مثال للتنفيذ
Enter Three Letters: ABC
A
B
C
10-اكتب برنامج يقوم بقراءة أحد الحروف في النظام السداسي عشر ( A-F ) يقوم البرنامج بطباعة الرقم المناظر في النظام العشري في السطر التالي. مثال للتنفيذ
Enter A Hexadecimal Digit: C
In Decimal It Is: 12
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 4:57 pm | |
| الفصل الرابع مسجل البيارق
أحد أهم مميزات الحاسب هي القدرة علي اتخاذ القرارات ويتم ذلك عن طريق تحديد حالة المعالج الدقيق بعد تنفيذ عملية محددة. في المعالج 8086 يتم تمثيل حالة المعالج بعد تنفيذ آخر عملية في 9 خانات ثنائية تسمي البيارق Flags ويتم اتخاذ القرارات المختلفة حسب قيمة هذه البيارق.
يتم تخزين البيارق في مسجل يسمي مسجل البيارق Flag Register ويمكن تقسيم البيارق إلي نوعين وهما بيارق التحكم Control Flags وبيارق الحالة Status Flags. وتقوم بيارق التحكم لتشغيل أو تعطيل عمليات محددة أثناء تنفيذ البرنامج بينما تقوم بيارق الحالة بعكس حالة المعالج بعد تنفيذ أمر محدد كأن يتم إظهار أن النتيجة تساوي صفر وذلك عن طريق رفع بيرق الصفر كما سنري في الجزء التالي. [b]
مسجل البيارق
يحتوي هذا المسجل علي البيارق المختلفة كما هو موضح بالشكل حيث يتم تمثيل بيارق الحالة في الخانات 0 و 2 و 4 و 6 و 7 و 11 بينما تشغل بيارق التحكم الخانات 8 و 9 و 10 وتبقي بقية الخانات بدوت استخدام ( ليس من الضروري معرفة موقع البيرق من المسجل في أغلب الحالات حيث توجد أوامر للتخاطب مع كل بيرق علي حدة )، سنتناول في الجزء التالي بيارق الحالة
[/b] | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:00 pm | |
|
شكل يوضح مسجل البيارق
بيارق الحالة Status Flags
تقوم هذه البيارق بإظهار حالة المعالج بعد تنفيذ آخر أمر فمثلاً عند تنفيذ الأمر SUB Ax,Bx فإن بيرق الصفر يتأثر وتصبح قيمته تساوي 1 إذا كانت النتيجة تساوي صفر. الجدول التالي يوضح البيارق المختلفة
بيارق الحالة Status Flagsالرمز | الاسم | Name | الخانة | CF
| بيرق المحمول | Carry Flag | 0 | PF | بيرق خانة التطابق | Parity Flag | 2 | AF | بيرق المحمول المساعد | Auxiliary Carry Flag | 4 |
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:02 pm | |
| ZF | بيرق الصفر
| Zero Flag | 6 | SF | بيرق الإشارة | Sign Flag | 7 | OF | بيرق الفيضان | Overflow Flag | 11 | بيارق التحكم Control Flags | TF | بيرق التنفيذ خطوة بخطوة | Trap Flag | 8 | IF | بيرق المقطعات | Interrupt Flag | 9 | DF | بيرق الاتجاه | Direction Flag | 10 |
بيرق المحمول Carry Flag (CF)
يحتوي هذا البيرق علي القيمة ‘1’ (يتم رفع البيرق ) إذا وجد محمول من أو إلي الخانة ذات الوزن الأكبر Most Significant Bit (MSB) ويتم ذلك في حالات الجمع والطرح المختلفة. خلاف ذلك تكون قيمة البيرق تساوي صفر.
يتأثر البيرق أيضاً في حالة عمليات الإزاحة Shift والدوران Rotate والتي سنتحدث عنها فيما بعد.
بيرق التطابق Parity Flag (PF)
يحتوي هذا البيرق علي القيمة ‘1’ إذا كان الحرف الأصغر من النتيجة Low Byte يحتوي علي عدد زوجي من الخانات التي تحتوي علي الرقم ‘1’. ويساوي صفر إذا كان عدد الخانات التي تحتوي علي الرقم ‘1’ فردي. فمثلاً إذا كانت نتيجة آخر عملية هو الرقم FFFEh فإن الحرف الأصغر يحتوي علي العدد FEH ( 1110 1111 ) وبالتالي فإن عدد الخانات التي تحتوي علي الرقم ‘1’ هو 7 خانات ( عدد فردي) وعلي هذا فإن قيمة البيرق تساوي ‘0’ ( PF = 0 )
بيرق المحمول المساعد Auxiliary Carry Flag (AF)
يحتوي هذا البيرق علي القيمة ‘1’ إذا كان هناك محمول من أو إلي الخانة الرابعة bit-3 ويتم استخدام هذا البيرق في حالة الكود Binary Coded Decimal (BCD).
بيرق الصفر Zero Flag (ZF)
يحتوي هذا البيرق علي القيمة ‘1’ (ZF=1) إذا كانت النتيجة تساوي صفر
بيرق الإشارة Sign Flag (SF)
يحتوي هذا البيرق علي القيمة ‘1’ إذا كانت الخانة ذات الوزن الأكبر MSB تساوي ‘1’ حيث يعني هذا أن النتيجة سالبة. ( أي أن SF = 1 إذا كانتMSB =1 و SF= 0 إذا كانت MSB= 0)
بيرق الفيضان Overflow Flag (OF)
يحتوي هذا البيرق علي القيمة ‘1’ (OF=1) إذا حدث فائض في حالة الأرقام ذات الإشارة Signed Numbers وإلا فإنه سيحتوي علي صفر. وسنناقش هذا الموضوع بالتفصيل في الأجزاء المتبقية من هذا الفصل.
الفيضان Overflowكما نعلم فإن إمكانية تخزين الأرقام في الحاسوب محدودة وذلك حسب المكان الذي سيتم فيه تخزين الرقم ( مثلاً أكبر رقم يمكن تمثيله وتخزينه في خانة واحدة One Byte هو الرقم 255 ) وعلي ذلك إذا أردنا إجراء عملية حسابية وزاد الناتج عن | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:04 pm | |
|
هذه القيمة فإن المكان لن يسمح بتخزين النتيجة وفي هذه الحالة يكون قد حدث فيضان. أمثلة علي الفيضان
يختلف الفيضان عند التحدث عن الأرقام الموجبة فقط ( الأرقام بدون إشارة ) Unsigned Numbers عنه في الأرقام بإشارة Signed Numbers. وعند إجراء عملية مثل الجمع هنالك أربع احتمالات للنتيجة:
1 - لا يوجد فيضان
2 - فيضان بإشارة فقط
3 - فيضان بدون إشارة فقط
4 - فيضان بإشارة وبدون إشارة
وكمثال للفيضان بدون إشارة وليس بإشارة افترض أن المسجل AX يحتوي علي الرقم FFFFh وأن المسجل BX يحتوي علي الرقم 1 وقمنا بتنفيذ الأمر ADD AX, BX ستكون النتيجة علي النحو التالي :
1111 1111 1111 1111
+ 0000 0000 0000 0001
= 1 0000 0000 0000 0000
وبالتالي يكو لدينا أحد احتمالين
1- إذا فسرنا هذه الأرقام علي أنها أرقام بدون إشارة فإن النتيجة الصحيحة هي الرقم 65536 أي الرقم السداسي عشر 10000h ولكن هذه النتيجة لا يمكن تخزينها في المسجل ( أكبر من أكبر رقم يمكن تخزينه 65535 ) حيث سيتم فقد الرقم 1 وتخزين الرقم 0000h في المسجل AX وبالتالي فإن النتيجة التي تم تسجيلها هي نتيجة خاطئة.
2- أما إذا فسرنا هذه الأرقام علي أنها أرقام بإشارة فإن الرقم الأول FFFFh هوالرقم –1 وعند جمع الرقم 1 إليه فإن النتيجة هي الرقم 0 وعلي هذا فإن النتيجة التي تم تخزينها ( الرقم 0) صحيحة وعلي هذا لم يحدث فيضان بإشارة.
مثال آخر لفيضان بإشارة وليس بدون إشارة، افترض أن كل من المسجلين AX و BX يحتويان علي العدد 7FFFh وتم تنفيذ الأمر ADD AX,BX تكون النتيجة علي النحو التالي:
0111 1111 1111 1111
+ 0111 1111 1111 1111
1111 1111 1111 1110 = FFFEh
وفي هذه الحالة التفسير للرقم 7FFFh في حالة الأرقام بإشارة أو بدون إشارة هو تفسير واحد حيث أن الخانة ذات الوزن الأكبر تساوي 0 ( MSB = 0 ) وهو الرقم 32767 (7FFFh) وعلي ذلك فإن نتيجة حاصل الجمع يجب أن تكون واحدة في الحالتين وهي الرقم 65534 وهذه النتيجة لا يمكن تخزينها في حالة الأرقام بإشارة حيث أن تفسير هذه النتيجة في حالة الأرقام بإشارة هو الرقم السالب ( -2 )
وعلي ذلك فلدينا في هذا المثال فيضان بإشارة ولا يوجد فيضان بدون إشارة
كيف يقوم المعالج بتوضيح حدوث الفيضان ؟
يقوم المعالج برفع بيرق الفيضان OF=1 إذا حدث فيضان بإشارة ورفع بيرق المحمول إذا حدث فيضان بدون إشارة CF=1
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:05 pm | |
|
وتصبح وظيفة البرنامج التأكد من حدوث أي من أنواع الفيضانات التي ذكرناها واتخاذ الإجراءات المناسبة. وإذا تم تجاهل هذه البيارق وحدث فيضان فقد تكون النتيجة غير صحيحة.
وعلي هذا فإن المعالج لا يفرق بين الأرقام بإشارة أو بدون إشارة فهو فقط يقوم برفع البيارق لبيان حدوث أي من الفيضان بإشارة أو بدون إشارة. فإذا كنا في البرنامج نتعامل مع الأرقام علي أنها بدون إشارة فإننا نهتم ببيرق المحمول فقط CF ونتجاهل بيرق الفيضان OF. أما إذا كنا نتعامل مع الأرقام بإشارة فإن بيرق الفيضان OF هو الذي يهمنا. كيف يقوم المعالج بتحديد حدوث الفيضان ؟
كثير من الأوامر تؤدي إلي حدوث فيضان وسنناقش هنا أوامر الجمع والطرح للتبسيط
الفيضان بدون إشارة Unsigned overflow
في حالة الجمع يحدث فيضان بدون إشارة إذا كان هناك محمول من الخانة ذات الوزن الأكبر MSB حيث يعني هذا أن النتيجة أكبر من أن يتم تخزينها في المسجل المستودع ( أي أن النتيجة أكبر من أكبر رقم يمكن تخزينه وهو الرقم FFFFh في حالة أن يكون المستودع به 16 خانة ثنائية أو FFh في حالة أن يكون المستودع به 8 خانات ثنائية ).
في حالة الطرح يحدث الفيضان في حالة الاستلاف للخانة ذات الوزن الأكبر حيث يعني هذا ان النتيجة أقل من الصفر ( رقم سالب ).
الفيضان بإشارة Signed Overflow
في حالة جمع أرقام بنفس الإشارة يحدث الفيضان في حالة أن تكون إشارة حاصل الجمع مختلفة عن إشارة الرقمين. كما نجد أنه في حالة طرح رقمين بإشارة مختلفة فإن العملية تشابه عملية الجمع لرقمين بإشارة واحدة حيث أن A – ( - B ) = A + B , -A – ( +B ) = -A -B
ويحدث الفيضان بإشارة إذا اختلفت إشارة النتيجة عن الإشارة المتوقعة كما في حالة عملية الجمع
أما في حالة جمع رقمين بإشارتين مختلفتين فإن حدوث الفيضان مستحيل حيث أن العملية A+-(B) هي عبارة عن A-B وحيث أن الأرقام A و B أرقام صغيرة أمكن تمثيلها فإن الفرق بينهما هو أيضاً رقم صغير يمكن تمثيله . وبالمثل فإن عملية الطرح لرقمين بإشارتين مختلفتين لن تعطي أي فيضان.
وعموماً فإن المعالج يقوم برفع بيرق الفيضان كالآتي : إذا كان المحمول إلي الخانة ذات الوزن الأكبر MSB والمحمول من الخانة ذات الوزن الأكبر مختلفان ( ويعني هذا أنه يوجد محمول إليها ولا يوجد محمول منها أو لا يوجد محمول إليها ولكن يوجد محمول منها ). في هذه الحالة يتم رفع بيرق الفيضان ( أنظر الأمثلة لاحقاً ).
كيف تؤثر العمليات علي البيارق:
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:06 pm | |
|
عندما يقوم المعالج بتنفيذ أي أمر يتم رفع البيارق المناسبة لتوضيح النتيجة . وعموماً هناك أوامر لا تؤثر في كل البيارق وإنما تؤثر في بعضها فقط إذ قد تترك كل البيارق دون تأثير . وعموماً فإن عملية تفرع البرنامج باستخدام أوامر التفرع JUMP INSTRUCTIONS تعتمد عملياً علي قيم البيارق المختلفة كما سنري فيما بعد .
في هذا الجزء سنوضح تأثير البيارق في حالة تنفيذ بعض الأوامر التي ناقشناها وتعاملنا معها في الفصل السابق : الأمر | البيارق المتأثرة | MOV / XCHG
| لا تتأثر أي من البيارق | ADD / SUB | تتأثر كل البيارق | INC / DEC | تتأثر كل البيارق عدا بيرق المحمول (CF) | NEG | تتأثر البيارق ( CF=1 إلا إذا كانت النتيجة تساوي 0 ، 0F=1 إذا كان المعامل هو الرقم 800H في حالة WORD أو 80h في حالة المعامل Byte ) |
لتوضيح تأثر البيارق بتنفيذ العمليات سنقوم بعمل بعض الأمثلة في كل مثال سنوضح الأمر ومحتوي المعاملات operands وحساب وتوقع قيم البيارق المختلفة 0f,sf,zf,pf,cf (سنتجاهل بيرق المحمول المساعد AF لأنه في الحالة ذات الأرقام من النوع BCD فقط ).
مثال 1:
نفذ الأمر ADD AX,BX حيث يحتوي المسجل AX علي الرقم FFFFhوالمسجل BX علي
الرقم FFFFh
الحل :
FFFFh
+FFFFh
1FFFEh
يتم تخزين الرقم 1111 1111 1111 1110 (0FFFEh) في المسجل AX وعلي هذا تكون البيارق علي النحو التالي:
بيرق الإشارة SF : يساوي 1 لأن قيمة الخانة ذات الوزن الأعلى MSB تساوي 1 .
بيرق خانة التطابق PF : يساوي 0 لأن لدينا عدد 7 خانات (عدد فردي) تحتوي علي 1 في النصف الأدنى LOW BYTE في النتيجة .
بيرق الصفر ZF : يساوي 0 لأن النتيجة لا تساوي صفر .
بيرق المحمول CF : يساوي 1 لأن هناك محمول في الخانة ذات الوزن الأكبر MSB في عملية
الجمع .
بيرق الفيضان OF : يساوي صفر لأن إشارة النتيجة هي نفس إشارة الأرقام التي تم جمعها
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:07 pm | |
|
( المحمول إلي الخانة MSB لا يختلف عن المحمول من الخانة MSB ).
مثال 2 :
نفذ الأمر ADD AL,BL حيث يحتوي AL علي الرقم 80h و BL علي الرقم 80h
الحل :
80h
+80h
100h
يحتوي المسجل AL علي الرقم 00h
بيرق الإشارة SF : SF=0 لأن الخانة MSB تحتوي علي 0
بيرق خانة التطابق PF: PF=1 لأنه لدينا عدد 0 خانة تحتوي علي الرقم 1 ويعتبر الصفر عدد زوجي
بيرق الصفر ZF : ZF=1 لأن النتيجة تساوي 0
بيرق المحمول CF : CF=1 لأن هناك محمول إلى الخانة ذات الوزن الأكبر MSB
بيرق الفيضان OF : OF=1 لأن الأرقام المجموعة سالبة بينما النتيجة موجبة ( المحمول إلي الخانة
MSB لا يساوي المحمول منها ).
مثال 3:
نفذ الأمر SUB AX,BX إذا كان المسجل AX يحتوي علي الرقم 8000h والمسجل
BX يحتوي علي الرقم 0001h
الحل :
8000h
-0001h
7FFFh = 0111 1111 1111 1111
بيرق الإشارة SF : SF=0 لأن خانة MSB=0 (آخر خانة في MSB)
بيرق خانة التطابق PF: PF=1 لأن الخانة الصغري من النتيجة بها 8 خانات (عدد زوجي) بها "1"
بيرق الصفر ZF : ZF=0 لأن النتيجة لاتساوي 0
بيرق المحمول CF : CF=0 لأننا قمنا بطرح عدد صغير بدون إشارة من عدد أكبر منه
بيرق الفيضان OF : OF=1 في حالة الأرقام بإشارة فإننا نطرح رقم موجب من رقم سالب . وهي
مثل عملية جمع رقمين سالبين. ولأن النتيجة أصبحت موجبة (إشارة النتيجة خطأ) .
مثال 4:
نفذ الأمر INC AL حيث AL يحتوي علي الرقم FFh
الحل :
FFh
1h +
100h
يتم تخزين الرقم 100h في المسجل AL .بعد تنفيذ هذه العملية نجد أن
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الجمعة فبراير 22, 2008 5:08 pm | |
|
[b]بيرق الإشارة SF : SF=0 لأن MSB=0
بيرق خانة التطابق PF: PF=1 لوجود 8 خانات تحتوي علي “1” في البايت الأدنى من النتيجة
بيرق الصفر ZF : ZF=1 لأن النتيجة تساوي صفر
بيرق المحمول CF : لا يتأثر بالأمر INC بالرغم من حدوث فائض.
بيرق الفيضان OF : OF=0 وذلك لأننا نجمع رقم سالب إلي رقم موجب ( المحمول إلي
الخانة MSB يساوي المحمول منها ).
مثال 5:
نفذ الأمر MOV AX,-5
يتم وضع الرقم –5 (FFFBh) في المسجل AX ولا تتأثر أي من البيارق بالأمر MOV .
مثال 6:
نفذ الأمر NEG AX حيث يحتوي المسجل AX علي الرقم 8000h
8000h = 1000 0000 0000 0000 [size=12]COMPLEMENT = 1000 0000 0000 0000
0000 0000 0000 1000
بيرق الإشارة SF : SF=1
بيرق خانة التطابق PF: PF=1
بيرق الصفر ZF : ZF=0
بيرق المحمول CF : CF=1 لأنه في حالة تغيير الإشارة فإن CF =1 دائماً إلا إذا كان الرقم
يساوي صفر .
بيرق الفيضان OF : OF=1 لأننا عند تنفيذ الأمر NEG نتوقع تغيير إشارته وفي هذه الحالة لم
تتغير الإشارة .
برنامج DEBUG :
يمكن باستخدام برنامج DEBUG متابعة تنفيذ البرنامج خطوة_خطوة وإظهار النتيجة وتأثر المسجلات بعد كل خطوة كما يمكن كتابة برنامج بلغة التجميع حيث يقوم بتحويله إلي لغة الآلة مباشرة وتخزينها في الذاكرة
ولاستعمال برنامج الـ DEBUG نقوم بكتابة برنامج بلغة التجميع وتجهيزه حتى نحصل علي الملف القابل للتنفيذ EXCUTABLE FILE بعد ذلك يمكننا تحميل البرنامج بواسطة الأمر
C:\DOS\DEBUG TEST.EXE
يقوم البرنامج بالرد بالإشارة "-" دليل علي أنه في حالة انتظار لأحد الأوامر وهنا توضيح لبعض الأوامر الهامة :-
1. الأمر R وهو يوضح محتويات المسجلات . ولوضع قيمة محددة في أحد المسجلات يتم كتابة الأمر R متبوعاً بإسم المسجل (مثلاُ R IP).
2. الأمر T (TRACE) وهو يؤدي إلي تنفيذ الخطوة الحالية فقط من البرنامج .
3. الأمر G ( GO ) يؤدي إلي تنفيذ البرنامج .
4. الأمر Q(QUIT) يؤدي إلي الخروج من البرنامج .
5. الأمرA ASSEMBLE يتيح فرصة كتابة برنامج .
| |
|
| |
| لغة التجميع و المعالجات الدقيقة | |
|