عرض مشاركة واحدة
قديم 18-04-2010, 10:51 AM   #4
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 39
المشاركات: 2,917
بمعدل: 0.63 (مشاركة/اليوم)



افتراضي

 

مدخل إلي لغة التجميع

بعد توضيح التركيب الداخلي للمعالج 8088 والتعرف على المسجلات المختلفة الموجودة به سنتناول في هذا الفصل كيفية كتابة وتجهيز وتشغيل برنامج لغة التجميع وبنهاية الفصل سنستطيع أن نكتب برنامج لغة تجميع وان نقوم بتشغيله ورؤية النتيجة.
كأي لغة سنبدأ بتوضيح الصيغة العامة للأوامر وهى صيغه بسيطة جداً في لغة التجميع. بعدها سنوضح طريقة تعريف المتغيرات داخل البرنامج وبعدها نستعرض بعض أوامر نقل البيانات وأوامر العمليات الحسابية البسيطة. في النهاية سنستعرض الشكل العام للبرنامج والذي ستلاحظ أنه يتكون من جزء خاص بالأوامر وجزء ثاني خاص بالبيانات وجزء أخير خاص بالمكدس، سيتم استخدام بعض النداءات البسيطة لنظام التشغيل ليقوم بتنفيذ عمليات الإدخال والإخراج.
في النهاية سيتم توضيح كيفية تحويل برنامج لغة التجميع إلى لغة الآلة وتشغيل البرنامج في صورته النهائية.
تعليمات لغة التجميع:-
يتم تحويل برنامج لغة التجميع للغة الآلة بواسطة برنامج يسمى Assembler وبالتالي يجب كتابة التعليمات بصوره محدده حتى يتعرف عليها الـ Assembler، وفى هذا الجزء سنتناول الشكل العام للأوامر المستخدمة.
يتكون البرنامج من مجموعه من التعليمات أو الأوامر بحيث يحتوى كل سطر على أمر واحد فقط كما أن هنالك نوعين من التعليمات.
الأوامر أو التعليمات Instructions والتي يقوم الـ Assembler بتحويلها إلي لغة الآلة والإيعازات Assembler-Directives وهى إيعازات للـ Assembler للقيام ببعض العمليات المحددة مثل تخصيص جزء من الذاكرة لمتغير محدد وتوليد برنامج فرعى.
كل الأوامر في لغة التجميع تأخذ الصورة
NAME OPERATION OPERAND(S) COMMENT
يتم الفصل بين الحقول بواسطة مفتاح الـ TAB أو المسطرة(SPACE) أي يكون هناك فراغ واحد على الأقل بين كل حقل والحقل التالي.
يتم استخدام الاسم NAME في حالة حدوث عملية تفريع لهذا الأمر ( لهذا السطر من البرنامج) في جزء ما من البرنامج وهو حقل اختياري.
الحقل Operation يحتوى على الأمر المطلوب تنفيذه.
الحقل Operation(s) يحتوى على المعامل أو المعاملات المطلوب تنفيذها بواسطة الأمر المحدد ويعتمد على نوع الأمر. (لاحظ أن هناك بعض الأوامر لا تتطلب وجود هذا الحقل).
حقل الملحوظات الـ Comments يستخدم عادة للتعليق على الأمر الحالي وهو يستخدم لتوثيق البرنامج.
كمثال للتعليمات
Srart: MOV CX , 5 ; initialize counter
هذه الأمر ذو عنوان Start والأمر المستخدم MOV والمعاملات هي CX والرقم 5 ومعنى ذلك هو وضع الرقم 5 في المسجل CX وحقل الملاحظات يوضح أن 5 هي القيمة الابتدائية للعداد.
ومثال للإيعازات:
Main Proc
وهذا الإيعاز يقوم بتعريف برنامج فرعي (إجراء) باسم Main. فيما يلي سنتحدث عن الحقول المختلفة بالتفصيل:
حقل العنوان Name Field
يتم استخدام هذا الحقل لإعطاء عنوان لأمر محدد أو لإعطاء اسم لبرنامج فرعي كذلك لإعلان أسماء المتغيرات، يتم تحويل هذا الحقل إلي عناوين في الذاكرة.
يمكن أن يكون هذا الحقل بطول حتى 31 حرف وغير مسموح وجود مسافات بداخل الحقل كذلك لا يستخدم الحرف “.” إلا في بداية الاسم ولا يبدأ برقم ولا يتم التفريق بين الحروف الكبيرة والصغيرة فيه.
أمثلة لأسماء مقبولة:
start – counter - @character – sum_of_digits - $1000 – done? -.test
أمثلة لأسماء غير مقبولة:
two words يحتوي علي فراغات
2abc يبدأ برقم
a45.ab يحتوي علي الحرف (.) في منتصفه

حقل التعليمة (الأمر) Operation Field
يحتوي هذا الحقل علي الأمر OpCode المطلوب تنفيذها في هذا السطر ويجب أن تكون إحدى التعليمات المعروفة للبرنامج الذي سيقوم بمعالجة البرنامج وهو الـ Assembler حيث سيقوم بتحويلها إلي لغة الآلة كمثال لذلك التعليمات Sub و Add و Mov وكلها تعليمات معرفة وسيتم الحديث عنها بالتفصيل لاحقاً.
أما إذا كانت إيعازاً Pseudo-Op فلا يتم تحويلها للغة الآلة ولكنها لإخطار الـ Assembler ليقوم بشيء محدد مثلاً Proc تستخدم لتعريف برنامج فرعي Procedure

حقل المعاملات Operand Field
يحتوي هذا الحقل علي المعاملات من مسجلات ومتغيرات وثوابت والتي سيتم تنفيذ الأمر الحالي عليها ( مثل عملية الجمع مثلاً ) ويمكن لهذا الحقل أن يحتوي علي قيمتين أو قيمة واحدة أو لا يحتوي علي أي قيمة علي الإطلاق وذلك حسب نوع الأمر المستخدم والأمثلة التالية توضح ذلك
الأمر
المعاملات
NOP
لا توجد معاملات
INC CX
يوجد معامل واحد وهو المسجل CX
ADD Word1 , 2
يوجد معاملان وهما المتغير Word1 والرقم 2

في حالة الحقول ذات المعاملين يكون المعامل الأول هو الذي سيتم تخزين النتيجة فيه ويسمى بالمستودع destination Operand وهو يكون إما أحد المسجلات أو موقع محدد في الذاكرة ( لاحظ أن بعض الأوامر لا تقوم بتخزين النتيجة أصلاً ) أما المعامل الثاني فيحتوي علي المصدر Source Operand وعادة لا يتم تغيير قيمته بعد تنفيذ الأمر الحالي.
أما بالنسبة للإيعازات فيحتوي المعامل عادة علي معلومات إضافية عن الإيعاز.

حقل التعليقات والملاحظات Comment Field
يحتوي هذا الحقل علي ملاحظات من المبرمج وتعليقات علي الأمر الحالي وهو عادة ما يقوم بتوضيح وظيفة الأمر وأي معلومات إضافية قد تكون مفيدة لأي شخص قد يقرأ البرنامج وتساعده في فهمه. يتم بدء هذا الحقل بالفاصلة المنقوطة ";" وأي عبارة تقع بعد هذه الفاصلة المنقوطة يتم تجاهلها علي أنها ملاحظات.
رغم أن هذا الحقل اختياري ولكن لأن لغة التجميع تحتاج التعليمات فيها لبعض الشرح فإنه من الأفضل أن يتم وضع تعليقات علي أي أمر غير واضح أو يحتاج لتفسير وعادة ما يتم وضع تعليق علي كل سطر من أسطر البرنامج ويتم اكتساب الخبرة بمرور الزمن عن كيفية وضع التعليق المناسب. فمثلاً التعليق التالي غير مناسب:
MOV CX , 0 ; move 0 to CX
وكان من الأفضل أن يتم كتابة التعليق التالي:
MOV CX , 0 ; CX counts terms, initialized to 0
كما يتم أحياناً استخدام سطر كامل علي أنه تعليق وذلك في حالة شرح فقرة محددة كما في المثال التالي:
;
; Initialize Registers
MOV CX,0
MOV BX, 0
البيانات المستخدمة في البرنامج Program Data
يقوم البرنامج بالتعامل مع البيانات في صورة أرقام ثنائية وفي برامج لغة التجميع يتم التعامل مع الأرقام في الصورة الثنائية أو السداسية عشر أو العشرية أو حتى في صورة حروف.
الأعداد Numbers
يتم كتابة الأرقام الثنائية في صورة 0 و1 وتنتهي الحرف B أو b للدلالة علي أن الرقم ثنائي Binary
مثل 01010111B أو 11100011b
الأرقام العشرية يتم كتابتها في الصورة المعتادة وبدون حرف في النهاية، كما يمكن أن تنتهي بالحرف D أو الحرف d دلالة علي أنها عشرية Decimal مثل 1234 و 1345d و –234D.
الأرقام السداسية عشر يجب أن تبدأ برقم وتنتهي بالحرف H أو الحرف h للدلالة علي أنها سداسية عشر Hexadecimal مثل 0abh أو 56H. ( السبب في استعمال 0 في المثال الأول لتوضيح أن المطلوب هو الرقم السداسي عشر ab وليس المتغير المسمى ab ).
الجدول التالي يوضح بعض الأمثلة

الرقم

ملحوظات

10011

عشري

10011b

ثنائي

6455

عشري

-456h

سداسي عشر

FFFFh

خطأ ( لا يبدأ برقم )

1,234

خطأ ( يحتوي على حرف غير رقمي )

0ab

خطأ (لم ينتهي بالحرف h أو H)




الحروف Characters
يتم وضع الحروف والجمل داخل علامات التنصيص مثلاً ‘A’ أو ‘SUDAN’ ويتم داخلياً تحويل الحروف إلي الأرقام المناظرة في كود الـ ASCII بواسطة الـ Assembler وبالتالي تخزينها في الذاكرة وعلى ذلك لا يوجد فرق بين الحرف ‘A’ والرقم 41h ( وهو الرقم المناظر للحرف A في الجدول) وذلك داخل البرنامج أو من ناحية التخزين في الذاكرة.
المتغيــرات VARIABLES
تلعب المتغيرات في لغـة التجميع نفس الدور الذي تلعبه في البرامج باللغات ذات المستوى العالي High Level Programming DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokias مثل لغة الباسكال والسي. وعلى ذلك يجب تحديد أسماء المتغيرات المستخدمة في البرنامج ونوع كل متغير حيث سيتم حجز مكان في الذاكرة لكل متغير وبطول يتناسب مع نوع المتغير وذلك بمجرد تعريف المتغير. ويتم استخدام الجدول التالي لتعريف المتغيرات في لغة التجميع حيث يشير كل إيعاز لنوع المتغير المطلوب تعريفه.

الايعـــــاز


المعــــــــــــــنــى

DB (Define Byte)
لتعريف متغير حرفي يشغل خانة واحدة في الذاكرة
DW (Define Word )
لتعريف متغير كلمة يشغل خانتين متتاليتين في الذاكرة
DD (Define Double Word)
لتعريف متغير يشغل أربعة خانات متتالية في الذاكرة
DQ (Define Quad Word)
لتعريف متغير يشغل ثمان خانات متتالية في الذاكرة
DT (Define Ten Bytes)
لتعريف متغير يشغل عشر خانات متتالية في الذاكرة

في هذا الجزء سنقوم بالتعامل مع المتغيرات من النوع DB و DW.

المتغيرات الحرفيــة Byte Variables:
يتم تعر يف المتغيرات الحرفية بالصورة التالية:
Name DB Initial_Value
مثلاً
Alpha DB 4
يقوم هذا الإيعاز بتعريف متغير يشغل خانه واحدة في الذاكرة واسمه Alpha ويتم وضع قيمه ابتدائيـة مقدارها 4 في هذا المتغير.
يتم استعمال علامة الاستفهام ( ؟) في حالة عدم وجود قيمه ابتدائية للمتغيــر.
مثال: ? DB Byte
القيــم التي يمكن تخزينها في هذا المتغير تتراوح بين 0 و 255 في حالة الأرقام التي يتم تخزينها بدون إشارةUnsigned Numbers و بين 128- و 127+ في حالة الأرقام التي يتــم تخزينها بإشارة Signed Numbers.

متغيرات الجمل Word Variables
يتم تعريف المتغير علي أنه من النوع Word ويتم تخزينه في خانتين من الذاكرة Two Bytes وذلك باستخدام الصيغة
name DW initial_value
مثلاً التعريف التالي
WRD DW -2
يتم فيه تعريف متغير باسم WRD ووضع قيمة ابتدائية ( الرقم –2 ) فيه
كما في حالة المتغيرات الحرفية يتم وضع العلامة ؟ في حالة عدم وجود قيمة ابتدائية للمتغير.
يمكن للمتغير من النوع word تخزين أرقام تتراوح بين 0 و 65535 ( 216 –1 ) في حالة الأرقام بدون إشارة ( الموجبة فقط )Unsigned Numbers
ويمكن تخزين الأرقام من –32768 ( -215 ) وحتى 32767 ( 215 - 1 ) في حالة الأرقام بإشارة
( الموجبة والسالبة )Signed Numbers.

المصفوفات Arrays
في لغة التجميع نتعامل مع المصفوفات علي أنها مجموعة من الحروف أو الكلمات المتراصة في الذاكرة في عناوين متتالية. فمثلاً لتعريف مصفوفة تحتوي علي ثلاثة أرقام من النوع الحرفي 3Bytes بقيم ابتدائية 10h و 20h و 30h علي الترتيب يتم استخدام التعريف التالي:
B_ARRAY DB 10h, 20h, 30h
الاسم B_ARRAY يشير إلي العنصر الأول في المصفوف) العدد 10h ) والاسم B_ARRAY + 1 يشير إلي العنصر الثاني والاسم B_ARRAY + 2 يشير إلي العنصر الثالث. فمثلاً إذا تم تخصيص عنوان الإزاحة 0200h للمتغير B_ARRAY يكون شكل الذاكرة كما يلي:

المحتوي


العنوان


الاسم ( الرمز Symbol)

10h
200h0
B_ARRAY
20h
0201h
B_ARRAY + 1
30h
0202h
B_ARRAY + 2


وبنفس الطريقة يتم تعريف مصفوف مكون من كلمات فمثلاً التعريف
W_ARRAY DW 1000h, 2000h, 3000h
يقوم بتعريف مصفوف يحتوي علي ثلاثة عناصر بقيم ابتدائية 1000h و 2000h و 3000h علي الترتيب. يتم تخرين القيمة الأولى ( 1000h )في العنوان W_ARRAY والقيمة الثانية في العنوان W_ARRAY +2 والقيمة الثالثة في العنوان W_ARRAY + 4 وهكذا. فمثلاً لو تم تخزين المصفوف في الذاكرة بدءاً من العنوان 300h يكون شكل الذاكرة كما يلي:


المحتوي


العنوان


الاسم ( الرمز Symbol )

1000h
0300h
W_ARRAY
2000h
0302h
W_ARRAY + 2
3000h
0304h
W_ARRAY + 4


لاحظ أن للمتغيرات من هذا النوع يتم تخزينها في الذاكرة في خانتين حيث يتم تخزين الخانة ذات الوزن الأقل Low Byte في الخانة الأولي والخانة ذات الوزن الأكبر High Byte في العنوان التالي مباشرة. فمثلاً إذا كان لدينا التعريف: Word1 DW 1234h
يتم تخزين الرقم 34h ( الذي يمثل الخانة ذات الوزن الأقل) في العنوان word1 والرقم 12h ( الذي يمثل الخانة ذات الوزن الأكبر) في العنوان word1 + 1.







التوقيع
جمال الزرقاء غير متواجد حالياً  
رد مع اقتباس