| لغة التجميع و المعالجات الدقيقة | |
|
|
|
كاتب الموضوع | رسالة |
---|
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:38 pm | |
|
لغة التجميع و المعالجات الدقيقة Assembly Language Programming and Microprocessors
الفصل الأول
مقدمة
في هذه المحاضرات سنتناول موضوع المعالجات الدقيقة وبرمجتها وسيتم التركيز علي المعالجات المستخدمة في الأجهزة الشخصية Personal Computers وهي المعالجات المصنعة بواسطة شركة Intel والمعالجات المتوافقة معها. وقد تمت الاستعانة بمجموعة من المراجع التي تغطي هذا الموضوع ولكن تم اعتماد المرجع الأول و هو كتاب Assembly Language Programming and Organization of The IBM PC كمرجع أساسي تم اللجوء إليه بصورة أساسية في كتابة هذه المادة هذا بالإضافة إلي مجموعة المراجع الأخرى والتي تم توضيحها في نهاية المادة
الخلفية المطلوبة Background
يجب الإلمام جيدا بكيفية التعامل مع الأنظمة الرقمية المختلفة وبالذات النظام الثنائي والسداسي عشري وإجادة التعامل مع العمليات الحسابية المختلفة من جمع وطرح وضرب وقسمة للأرقام المختلفة في تلك الأنظمة.
كذلك يجب التعرف علي إحدى لغات البرمجة العليا علي الأقل ويفضل أن تكون إحدى اللغات التي تستعمل الهيكلة Structured Programming Language مثل الباسكال والسي ولكن يمكن بسهولة فهم البرامج بمجرد الإلمام بأي من لغات البرمجة العليا الأخرى. والهدف من ذلك هو كتابة بعض البرامج من خلال استعراض لغة التجميع ويفضل أن تكون لدينا بعض مهارات البرمجة المختلفة.
:
الفصل الثاني : يتناول المعالجات الدقيقة بصورة عامة والمعالجات المنتجة بواسطة شركة Intel بصورة خاصة ثم يتعرض للتركيب الداخلي للمعالج 8088 والمسجلات المختلفة به وطريقة التخاطب مع الذاكرة.
الفصل الثالث: يوضح الشكل العام للأوامر في لغة التجميع وتعريف المتغيرات والثوابت بالإضافة إلي التعرف علي مجموعة من الأوامر الأساسية والتعرف علي الشكل العام للبرنامج واستخدام نداءات المقاطعة للقيام بعمليات الإدخال والإخراج. في نهاية الفصل يتم كتابة برامج صغيرة وتجربتها.
الفصل الرابع: يتم فيه التعرف علي مسجل البيارق Flag Register وتأثر البيارق بالعمليات المختلفة وتوضيح حالات الفيضان المختلفة التي قد تحدث بعد تنفيذ عملية محددة.
الفصل الخامس: يتم فيه توضيح أوامر التفرع المختلفة وبعدها يتم التعرف علي كيفية تحويل البرامج الصغيرة من البرامج ذات المستوي العالي High Level Language ويتضمن ذلك تحويل أوامر التفرع والتكرار المختلفة إلى لغة التجميع. بعد ذلك تتم كتابة أحد البرامج الكبيرة نسبياً وتوضيح كيفية تحليل البرنامج إلى مرحلة الكتابة للبرنامج
الفصل السادس: يتناول أوامر الحساب والمنطق المختلفة وطريقة استخدامها في التعامل مع المسجلات ويتضمن ذلك أوامر الإزاحة والدوران. في نهاية الفصل تتم كتابة مجموعة من الإجراءات الفرعية لقراءة وكتابة الأرقام في النظامين الثنائي والسداسي عشري.
الفصل السابع: يتناول الحديث بالتفصيل عن المكدس Stack وكيفية التعامل معه، بعد ذلك يتم التعرف على طريقة كتابة البرامج الفرعية
الفصل الثامن: يتم فيه التعرف علي أوامر الضرب والقسمة واستخدام البرامج الفرعية عن طريق كتابتها في ملف مختلف. ويتم كتابة برامج فرعية تقوم بقراءة أرقام عشرية من لوحة المفاتيح وطباعتها في الشاشة.
الفصل التاسع: يتم فيه التعرف علي أنماط العنونة المختلفة والمستخدمة في لغة التجميع كما يتم التعرف علي طريقة التعامل مع المصفوفات المختلفة.
الفصل العاشر: يتم فيه التعرف علي أوامر التعامل مع النصوص وسلاسل الحروف Strings.
الهدف من المادة
في كثير من الأحيان نضطر لكتابة بعض البرامج الخاصة جداً والتي تتعامل مع مكونات النظام من أجهزة مختلفة وعند الانتهاء من دراسة هذه المادة يكون الطالب قد تعرف علي كيفية التعامل مع المعالج الدقيق مباشرة ومعرفة ما يدور في المستوى الأدنى للجهاز Low-Level ويصبح قادراً علي كتابة برامج تتعامل مع النظام في أدق تفاصيله كما يصبح بإمكانه تحليل وفهم أي برنامج كتب بلغة التجميع. ويصبح الطالب جاهزاً لدراسة مادة برمجة النظم Systems Programming
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:12 pm عدل 6 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:42 pm | |
| الفصل الثاني المعالجات وتنظيم الحاسب الشخصي مقدمة:
تعتمد الأجهزة المتوافقة مع نظام IBM على المعالجات من عائلة المعالج Intel. في هذا الفصل سيتم عرض عام للمعالجات من عائلة المعالج 8086 في الجزء الأول حيث يتم التعرف على المعالج 8086 مع توضيح المسجلات المختلفة و استخدامات كل مسجل ثم يتم توضيح عملية تقسيم الذاكرة إلي قطاعات Segments.
عائلة المعالجات Intel 8086
تعتمد الحاسبات الشخصية المتوافقة مع IBM على المعالجات من النوع Intel وهي تشمل المعالجات 8086 و 8088 و 80286 و 80386 و 80486 و أخيراً المعالج Pentium حيث يتم استخدام المعالج لبناء نظام حاسوب بخصائص محددة كما في حالات استخدام المعالج 8088 لبناء الحاسوب من النوع IBM PC و استخدام المعالج 80286 لبناء الحاسوب المسمى XT ( eXtended Technology ) كما تم بناء النظام AT ( Advanced Technology ) مع ظهور المعالج 80386.
ثم بعد ذلك ونتيجة لأهمية وضع نظم ثابتة ومعرفة للجميع ظهرت أنظمة ISA (Industry Standard Arch.) و EISA ( Extended ISA ) وهي أنظمة تستعمل المعالجين 80386 و 80486.
مع ظهور المعالج الجديد والمسمي Pentium ظهرت الحاجة لأنظمة جديدة ذات سرعة عالية فظهرت أنظمة الناقل المحلي Local Bus Systems مثل نظام PCI ونظام VESA وذلك للاستفادة من الإمكانات الجديدة للمعالج.
مما يجدر ذكره أن المعالجات من عائلة Intel حافظت على التوافقية في تصميم المعالجات بحيث يتم استيعاب وتنفيذ البرامج التي تمت كتابتها لتعمل مع المعالجات القديمة في المعالجات الجديدة بدون مشاكل وهو ما يسمى بتوافقية البرامج Software Compatibility وهي ميزة كبيرة في التصميم حيث تم الاحتفاظ بالبرامج القديمة دون أي تعديل مع إمكانية تشغيل البرامج الجديدة ذات الإمكانات الجديدة والتي لم تكن موجودة في المعالجات القديمة. فيما يلي سنتناول المعالجات المختلفة بشيء من التفصيل وذلك بتوضيح الخصائص العامة للمعالج من حيث طول الكلمة Word Length وأقصي قيمة للذاكرة بالإضافة لبعض الخصائص العامة.
المعالج 8086 والمعالج 8088
قامت شركة Intel في عام 1978 بطرح المعالج 8086 وهو معالج يتعامل مع كلمة بطول 16-bits (يتم التعامل 16-bitفي المرة الواحدة ).بعد ذلك وفي سنة 1979 تم طرح المعالج 8088 وهو مشابه للمعالج 8086 من ناحية التركيب الداخلي ولكنه مختلف عنه في التعامل العام الخارجي حيث يتم فيه التعامل الخارجي بكلمه طولها 8-bits بينما يتعامل المعالج 8086 باستخدام نبضة سريعة وبالتالي فان أداءه افضل (زيادة سرعة النبضة تعنى زيادة
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:13 pm عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:45 pm | |
|
التردد وبالتالي نقصان الزمن اللازم لتنفيذ أمر محدد ويتم تعريف سرعة المعالج بتحديد التردد الأقصى الذي يعمل به وتقاس وحدة التردد بالميجاهيرتز MHz).
قامت شركة IBM باختيار المعالج 8088 لبناء الحاسب الشخصي IBM PC وذلك لسهولة التعامل معه بالإضافة إلي رخص التكلفة حيث كان من المكلف في ذلك الوقت بناء الحاسب على المعالج 8086 ذات الـ16-bit وذلك بسبب ارتفاع تكلفة بناء نظام بوحدات مساعده تتعامل مع كلمة بطول 16-bit في ذلك الزمن.
يتعامل المعالجان 8086 و8088 بنفس التعليمات وهما يمثلان نقطة البداية التي بدأت منها المعالجات الجديدة والتي يتم استعمالها في أجهزة الحاسب الشخصية وبالتالي فان البرامج التي تعمل على المعالجين 8086 و 8088 مازالت صالحة للعمل في المعالجات الجديدة وهو ما أسميناه بالتوافقية في البرامج.
المعالجان 80186 و 80188
يعتبر المعالجان 80186 و 80188 تطويراً للمعالجين 8086 و 8088 وذلك عن طريق تنفيذ كل التعليمات التي كانت مستخدمة في المعالجات القديمة بالإضافة إلي بعض الأوامر المختصة بالتعامل مع بعض الوحدات المساعدة Support Chips.كذلك تمت إضافة بعض الأوامر الجديدة وهى ما تسمى بال Extended Instruction. وعموماً لـم يتم استعمال المعالجين في الأجهزة بصورة كبيرة وذلك نسبة لعدم وجود فارق كبير عن سابقيهما بالإضافة إلى ظهور المعالج الجديد 80286 في الأسواق.
المعالج 80286 :-
تم طرح المعالج 80286 في سنة 1982 م وهو معالج يتعامل مع كلمة بطول 16 Bits ولكنه أسرع بكثير من المعالج 8086 حيث تصل سرعته إلي 12.5 MHZ وذلك مقارنة مع 10 MHZ للمعالج 8086. كذلك تميز المعالج 80286 بالمزايا التالية :-
1 - نمطين للأداء Two Modes Of Operations
المعالج 80286 يمكنه العمل في نمطين وهما النمط الحقيقي Real Mode والنمط المحمى Protected Mode.
في النمط الحقيقي يعمل المعالج 80286 كمعالج من النوع 8086 وبالتالي فان البرامج التي تمت كتابتها للمعالج 8086 تعمل في هذا النمط بدون أي تعديل. أما في النمط المحمى فانه يمكن أن يتم تشغيل أكثر من برنامج في وقت واحد Multi_Tasking وبالتالي يلزم حماية كل برنامج من التعديل بواسطة برنامج آخر يعمل في الذاكرة في نفس الوقت وذلك بتخصيص منطقة
عدل سابقا من قبل zakagadir في الأربعاء فبراير 20, 2008 4:54 am عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:48 pm | |
|
محددة من الذاكرة لكل برنامج على حدة ومنع البرنامج من التعامل مع مناطق الذاكرة التي تخص البرنامج الآخر.
2 - ذاكرة أكبر :-
يمكن للمعالج 80286 التخاطب مع ذاكرة تصل إلي 16 MByte وذلك في النمط المحمى (مقابل 1 MBYTE للمعالج 8086 ).
3 - التعامل مع الذاكرة الافتراضية :-
حيث يتم ذلك في النمط المحمى وذلك بإتاحة الفرصة للمعالج للتعامل مع وحدات التخزين الخارجية لتنفيذ برامج كبيرة تصل لـ 1 GBYTE (لاحظ أن أقصى قيمة للذاكرة هي 16 MBYTE فقط) وسيتم التحدث عن هذه الطريقة بالتفصيل في مادة نظم التشغيل.
المعالج 80386 :-
في عام1985 تم إنتاج أول معالج يتعامل مع كلمة بطول 32 BITS وهو المعالج 80386 وهو أسرع بكثير من المعالج 80286 وذلك لمضاعفة طول الكلمة (من 16_BIT إلى32_BIT) ونسبة للسرعة الكبيرة التي يتعامل بها المعالج والتي تصل إلي 40 MHZ فإنه يقوم بتنفيذ عدد كبير من الأوامر في عدد أقل من عدد النبضات التي يستغرقها المعالج 80286.
يستطيع المعالج 80386 التعامل مع النمط الحقيقي والنمط المحمى حيث يعمل في النمط الحقيقي كالمعالج 80386 وفي النمط المحمى كالمعالج 80286. ذلك بالإضافة إلي نمط جديد يسمى بالنمط الافتراضي للمعالج 8086 (VIRTUAL 8086 MODE ) وهو نمط مصمم لجعل أكثر من برنامج من برامج المعالج 8086 تعمل في الذاكرة في وقت واحد.
يستطيع المعالج 80386 التعامل مع ذاكرة يصل حجمها إلي 4 Gbytes وذاكرة افتراضية يصل حجمها إلى 64 T BYTES.
توجد كذلك نسخة رخيصة من المعالج تسمى 80386SX وهى تحتوى على نفس الشكل الداخلي للمعالج 80386 ولكنها خارجيا تتعامل مع 16 BITS .
المعالج80486 :-
في عام 1989 ظهر المعالج 80486 وهو عبارة عن نسخة سريعة من المعالج 80386 حيث يحتوى على كل مزايا المعالج 80386 بالإضافة للسرعة الكبيرة وتنفيذ الكثير من الأوامر المستخدمة بكثرة في نبضة واحدة فقط كذلك احتوائه على المعالج المساعد 80387 والمختص بالعمليات الحسابية التي تحتوى على أعداد حقيقية حيث كانت هذه العمليات تستغرق وقتاً طويلاً من المعالج 80386 مما تطلب وجود المعالج 80387 والذي يسمي بالمعالج المساعد الرياضي Math. Co_Processor وقد تم دمج هذا المعالج مع المعالج 80386 بالإضافة إلي ذاكرة صغيرة تسمي بالـ Cache Memory (وهي ذاكرة ذات زمن وصول صغير جداً ويتم استخدامها كوسيلة لتبادل البيانات بين الذاكرة العادية والمعالج الدقيق)وحجمها 8 Kbytes.
يعتبر المعالج 80486 أسرع من المعالج 80386 والذي يعمل على نفس التردد بحوالي ثلاث مرات. هذا بالإضافة إلي أن المعالج 80486 يعمل على ترددات (سرعات) عالية جداً تصل إلي 100 M Hz.
عدل سابقا من قبل zakagadir في الأربعاء فبراير 20, 2008 4:56 am عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:50 pm | |
|
أما المعالج 80486SX فهو كالمعالج 80486 تماماً من حيث العمل الداخلي فيما عدا أنه لا يحتوي على معالج رياضي داخله. وقد ظهرت عدة إصدارات من المعالج 80486 ولكن لا توجد اختلافات جوهرية كبيرة بينها والمجال هنا لا يتسع لذكرها.
المعالج Pentium
المعالج Pentium هو آخر إصدارات شركة Intel وهو أول معالج يتعامل مع كلمة بطول 64 Bits بالإضافة إلي السرعة العالية جداً التي يعمل بها مقارنة بالمعالج 80486 هذا بالإضافة إلي زيادة حجم الذاكرة الداخلية Cache Memory.
وقد ظهرت إصدارات مختلفة للمعالج Pentium ازدادت فيها سرعة المعالج وتمت إضافة إمكانات إضافية إليه فيها مثل MMX والذي يمتاز بأن به أوامر للتعامل مع الوسائط المتعددة.
التركيب الداخلي للمعالج 8088 والمعالج 8086
في هذا الجزء سيتم التعرف على التركيب الداخلي للمعالج وذلك عن طريق التعرف على المسجلات المختلفة الموجودة داخل المعالج ووظيفة كل مسجل وسيتم في الأجزاء التالية مناقشة الأوامر المختلفة التي يتم استخدامها في التعامل مع المعالج. ونسبة لتوافقية البرامج التي تم الحفاظ علىها في المعالجات الجديدة سنجد أن هذه التعليمات يمكن استخدامها مع المعالجات الحديثة وحتى الـ Pentium. المسجلات
يتم تخزين البيانات داخل المعالج في المسجلات، ويتم تقسيم المسجلات إلى:
مسجلات بيانات: ويتم فيها التعامل مع البيانات من حيث التخزين وإجراء العمليات الحسابية والمنطقية.
مسجلات عناوين: ويتم فيها تخزين العناوين المختلفة.
مسجل الحالات: وهو يحتوي على حالة المعالج بعد تنفيذ أمر محدد.
ويحتوي المعالج على عدد 14 مسجل وسنقوم في الجزء التالي بتوضيح أسماء ووظيفة كل مسجل.
مسجلات البيانات DX,CX,BX,AX
يتم استخدام هذه المسجلات الأربعة في التعامل مع البيانات داخل المعالج و يمكن للمبرمج التعامل مباشرة مع هذه المسجلات. وبالرغم من أن المعالج يستطيع أن يتعامل مع بيانات في الذاكرة إلا أن التعامل مع المسجلات يكون أسرع بكثير من التعامل مع الذاكرة (يلزمه عدد اقل من النبضات) وبالتالي نفضل دائماً التعامل مع المسجلات لسرعتها. وهذا سبب زيادة عدد المسجلات في المعالجات الحديثة. يمكن التعامل مع كل من هذه المسجلات على أنه وحده واحدة بحجم 16-BITS أو على وحدتين كل واحدة بسعة 8-BITS إحداهما العليا HIGH و الثانية المنخفضة LOW مثلا يمكن التعامل مع المسجل AX على انه مسجل بحجم 16-BITS أو التعامل مع النصف العلوي (HIGH) AH على انه مسجل 8-BITS و المسجل المنخفض AL (LOW) على أنه مسجل .8-BITS وبالمثل مع المسجلات D,C,B و
عدل سابقا من قبل zakagadir في الأربعاء فبراير 20, 2008 4:57 am عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:52 pm | |
|
بالتالي يصبح لدينا 8 مسجلات من النوع 8-BITS أو أربعة مسجلات من النوع 16-BITS.
بالرغم أن المسجلات الأربعة ذات استخدامات عامه GENERAL PURPOSE REGISTERS بحيث يمكن استخدامها في أي استخدامات عامه إلا أن لكل مسجل استخداماً خاصاً نتناوله في الجزء التالي:
1-المسجل (Accumulator) AX
يعتبر المسجل AX هو المسجل المفضل للاستخدام في عمليات الحساب و المنطق و نقل البيانات و التعامل مع الذاكرة و موانئ الإدخال و الإخراج. و استخدامه يولد برامج اقصر ويزيد من كفاءة البرنامج. حيث يجب مثلا في عمليه ضرب رقمين وضع أحد الرقمين فيه مع وضع القيمة المطلوب إخراجها إلي ميناء خروج محدد فيه ثم تتم قراءه القيمة التي يتم إدخالها من ميناء خروج محدد فيه دائما. وعموما يتم التعامل مع المسجلAX على أنه أهم المسجلات الموجودة في المعالج.
2-المسجل (Base Register) BX
يستخدم المسجل BX في عنونه الذاكرة حيث تتطلب بعض العمليات التعامل مع الذاكرة بمؤشر محدد ويتم تغيير قيمه المؤشر لإجراء عمليه مسح لجزء محدد من الذاكرة كما سنرى فيما بعد.
3-المسجل (Count Register) CX
يتم استخدام المسجل CX كعداد للتحكم بعدد مرات تكرار مجموعه محدده من التعليمات.كذلك يتم استخدامه في تكرار عمليه دوران مسجل لعدد محدد من المرات.
4-المسجل (Data Register )DX
يتم استخدامه في عمليات الضرب والقسمة كذلك يتم استخدامه كمؤشر لموانئ الإدخال والإخراج عند استخدام عمليات الإدخال والإخراج.
مسجلات المقاطع CS, DS, SS, ES
يتم استخدام هذه المسجلات لتحديد عنوان محدد في الذاكرة. ولتوضيح وظيفة هذه المسجلات يجب في البداية توضيح طريقة تنظيم الذاكرة.
نعلم أن المعالج 8088 يتعامل مع 20 إشارة عناوين ( ناقل العناوين Address Bus يحتوي على 20 إشارة) وبالتالي يمكن مخاطبة ذاكرة تصل إلى 220 = 1,048,576 أي 1 Mbytes.
ونجد أن عناوين أول 5 خانات في الذاكرة هي :
00000 h = 0000 0000 0000 0000 0000
00001 h = 0000 0000 0000 0000 0001
00002 h = 0000 0000 0000 0000 0010
00003 h = 0000 0000 0000 0000 0011
00004 h = 0000 0000 0000 0000 0100
عدل سابقا من قبل zakagadir في الأربعاء فبراير 20, 2008 4:58 am عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:53 pm | |
|
ولأن العناوين في الصورة الثنائية تكون طويلة جداً فمن الأسهل التعامل مع العناوين بكتابتها في الصورة السداسية عشر وبالتالي يكون عنوان أول خانة في الذاكرة هو 00000h وعنوان آخر خانة هو FFFFFh.
مما سبق يتضح أن العنوان يتكون من 20 خانة بينما كل المسجلات الموجودة داخل المعالج ذات طول مقداره 16 خانة فقط مما يجعل مخاطبة الذاكرة كلها مستحيلة باستخدام مسجل واحد فقط ( لاحظ أن المسجل الواحد باستطاعته مخاطبة ذاكرة تصل إلي 64 Kbytes فقط ) ونتيجة لظهور هذه المشكلة تم تقسيم الذاكرة إلي مجموعة من المقاطع Segments كل مقطع بسعة 64 K Bytes كما سنوضح في الجزء التالي.
مقاطع الذاكرة
مقطع الذاكرة هو جزء متصل بطول 216 = 64 Kbytes وكل مقطع في الذاكرة يتم تحديده برقم محدد يسمي رقم المقطع Segment Number وهو رقم يبدأ بالرقم 0000h وينتهي بالرقم FFFFh.
بداخل المقطع يتم تحديد العنوان بواسطة إزاحة محددة Offset وهذه الإزاحة عبارة عن بُعد الموقع المحدد من بداية المقطع وهو رقم بطول 16 Bytes أي تتراوح قيمته بين الرقمين 0000h و FFFFh.
وبالتالي لتحديد عنوان محدد في الذاكرة يجب توضيح قيمة كل من المقطع والإزاحة وبالتالي تتم كتابة العنوان على الصورة: Segment : Offset
وهو ما يسمي بالعنوان المنطقي Logical Address فمثلاً العنوان AABB:5566 يعني الإزاحة 5566 داخل المقطع AABB.
للحصول على العنوان الفيزيائي يتم ضرب قيمة المقطع في الرقم 16 ( إزاحته لليسار بمقدار أربعة خانات ثنائية أو خانة واحدة سداسية عشر) ويتم بعد ذلك إضافة قيمة الإزاحة إليه وبالتالي فإن العنوان الفيزيائي المناظر للعنوان AABB:5566 هو:
| | |
1 | 1 | 1 | | | 0 | B | B | A | A | | | 6 | 6 | 5 | 5 | | + | (العنوان الفيزيائي بطول 20 خانة) | 6 | 1 | 1 | 0 | B | = |
وبالتالي يصبح العنوان الفيزيائي = رقم المقطع × 16+ قيمة الإزاحة = B0116
عدل سابقا من قبل zakagadir في الأربعاء فبراير 20, 2008 5:00 am عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الثلاثاء فبراير 19, 2008 6:56 pm | |
|
مواضع المقاطع LOCATIONS OF SEGMENTS
يتضح مما سبق أن المقطع الأول في الذاكرة يبدأ بالعنوان 0000:0000 أي 00000 وآخر عنوان داخل المقطع هو العنوان 0000:FFFF أي العنوان 0FFFF بينما يبدأ المقطع الثاني في العنوان 0001:0000 أي العنوان 00010 وينتهي بالعنوان 0001:FFFF أي العنوان 1000F. وكما نرى فإن هناك كثيراً من التداخل في المقاطع داخل الذاكرة. الشكل(1) يوضح الذاكرة وعناوين المقاطع المختلفة بداخلها:
محتويات الذاكرة | العنوان |
| 45 | 1001F | نهاية المقطع رقم 2 |
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:14 pm عدل 2 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:06 am | |
|
| …….. | | 45 | 1000F | نهاية المقطع رقم 1 |
| …….. | | 35 | 0FFFF | نهاية المقطع رقم 0 |
| …….. | |
|
| | 29 | 00020 | بداية المقطع رقم 2 |
|
| | 76 | 00010 | بداية المقطع رقم 1 |
|
| | 54 | 00000 | بداية المقطع رقم 0 |
الشكل ( 1 )
في الشكل(1) يتضح أن المقطع يبدأ بعد كل 16 خانة في الذاكرة. وعلى ذلك تسمى كل 16 خانة في الذاكرة بفقرة Paragraph. ويسمى أي من العناوين التي تقبل القسمة على العدد 10h بحدود الفقرات Paragraph Boundaries.
ولأن هنالك تداخلاً في القطاع فان تحديد العنوان الفيزيائي قد يتم بأكثر من طريقة أي عن طريق اكثر من تشكيلة في عنوان المقطع وعنوان الإزاحة. والأمثلة التالية توضح ذلك :
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:15 pm عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:07 am | |
|
مثال :- قم بتحديد قيمة الإزاحة المطلوبة لتحديد العنوان 1256A وذلك في :
أ- القطاع 1256 ب- القطاع 1240
الحل :
يتم استعمال المعادلة : العنوان = المقطع *16 + الإزاحة
أ- افترض أن قيمة الإزاحة المطلوبة X بالتعويض في المعادلة نجد أن
X +10h*1256 = 1256A
X +12560 = 1256A
X = 000A
وبالتالي فان العنوان هو 1256:000A
ب – بإتباع نفس الطريقة التي اتبعناها في الجزء السابق
افترض أن قيمة الإزاحة المطلوبة X بالتعويض في المعادلة نجد أن
X +10h *1240 = 1256A
X +12400 = 1256A
X = 016A
وبالتالي فان العنوان هو 1240:016A
أي أن العنوانين يشيران إلي نفس العنوان في الذاكرة 1256A = 1256:000A = 1240:016A
من الممكن أيضاً معرفة رقم المقطع بمعرفة العنوان الفيزيائي وقيمة الإزاحة كما في المثال التالي : مثال
ما هو عنوان المقطع لتحديد العنوان 80FD2h إذا كانت الإزاحة تساوي 8FD2h
باستعمال المعادلة : العنوان = المقطع *16 + الإزاحة، نجد أن
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:16 pm عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:09 am | |
|
80FD2h = قيمة مسجل المقطع * 10h + BFD2h
قيمة مسجل المقطع = 7500h
بعد توضيح عملية تقسيم الذاكرة لمقاطع مختلفة يمكننا الآن شرح عمل مسجلات المقاطع المختلفة، حيث يتكون البرنامج من مجموعة من الأوامر بالإضافة إلي مجموعه من المتغيرات هذا بالإضافة إلي الحاجة لاستخدام مكدس البيانات Stack والذي سنوضح طريقة استخدامه وعمله لاحقاً.
يتم وضع البرنامج في مقطع البرنامج Code Segment ووضع البيانات في مقطع البيانات Data Segment وكذلك المكدس حيث له مقطع المكدس Stack Segment ولدينا مقطع إضافي يسمي بالـ Extra Segment.
مسجل مقطع البرنامج Code Segment Register (CS)
يحتوي هذا المسجل على عنوان مقطع البرنامج Code Segment Address حيث يتم تحديد مقطع محدد في الذاكرة يتم وضع البرنامج فيه، بعد ذلك يلزم تعريف ذلك العنوان للمعالج حيث سيتم تنفيذ البرنامج؛ لذلك يجب تحديد عنوان هذا المقطع ووضعه في مسجل خاص يسمي بمسجل مقطع البيانات Code Segment Register (CS) ويتم تحديد قيمة الإزاحة باستخدام مسجل مؤشر التعليمات Instruction Pointer والذي سيتم التحدث عنه لاحقاً.
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:10 am | |
| مسجل مقطع البيانات Data segment Register (DS)
يحتوي هذا المسجل على عنوان مقطع البيانات Data Segment Address حيث يتم تعريف البيانات التي يتعامل معها البرنامج في منطقة محددة من الذاكرة ( وتسمي مقطع البيانات ) ويتم تحديد عنوان هذا المقطع ووضعه في المسجل DS. بعد ذلك يمكن مخاطبة الذاكرة والتعامل مع المتغيرات المختلفة باستخدام مسجلات أخري تحوي قيمة الإزاحة المطلوبة.
مسجل مقطع المكدس Stack Segment Register (SS)
يتم تحديد جزء من الذاكرة والتعامل معه كمكدس حيث يعمل المكدس بطريقة (Last In First Out ( LIFO )ويتم استعماله في مجموعة من العمليات أهمها عملية النداء لبرامج فرعية كما سنرى لاحقاً ويتم استعمال مجموعة المسجلات لتحوي قيمة الإزاحة ومن أهمها مؤشر المكدس Stack Pointer (SP).
مسجل المقطع الإضافي Extra Segment Register (ES)
ويتم استخدام هذا المسجل لتحديد ومخاطبة مقطع إضافي حيث تلزم في بعض الأحيان عملية مخاطبة أكثر من مقطع في وقت واحد ( مثل نقل كمية من البيانات في الذاكرة من مكان محدد لمكان آخر في مقطع بعيد وبالتالي لا يكفي مسجل البيانات فقط ولكن نحتاج لمسجل إضافي لتحديد المقطع الآخر فيتم استعمال المقطع الإضافي ( ES ).
[u]مسجلات المؤشرات والفهرسة Index and Pointer Registers (SP, BP, SI, DI)
[/u]
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:17 pm عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:10 am | |
|
يتم استخدام هذه المسجلات مع مسجلات المقاطع التي تحدثنا عنها في الجزء السابق للتخاطب مع عناوين محددة في الذاكرة، وعكس مسجلات المقاطع يمكن إجراء عمليات الحساب والمنطق على هذه المسجلات.
مؤشر المكدس Stack Pointer (SP)
يتم استخدام هذا المسجل مع مقطع المكدس وسيتم التحدث بالتفصيل عن المكدس في الفصول القادمة.
مؤشر القاعدة Base Pointer (BP)
يتم استخدام هذا المسجل أساساً للتخاطب مع البيانات الموجودة في المكدس ولكنه عكس مؤشر المكدس حيث يمكن استخدامه لمخاطبة الذاكرة في مقاطع أخري غير مقطع المكدس.
مسجل فهرسة المصدر Source Index (SI)
يستخدم هذا المسجل في مخاطبة الذاكرة في مقطع البيانات حيث يقوم بالإشارة إلي بداية ( أو نهاية) منطقة محددة من الذاكرة مطلوب التعامل معها؛ وبتغيير قيمة هذا المسجل في كل مرة يتم التعامل مع كل هذه المنطقة من الذاكرة.
مسجل فهرسة المستودع Destination Index (DI)
هذا المسجل يستخدم مثل مسجل فهرسة المصدر SI حيث يشير هذا المسجل إلي عنوان الذاكرة الذي سيتم تخزين البيانات فيه ويتم ذلك عادة باستخدام المقطع الإضافي ES وهناك مجموعة من الأوامر التي تتعامل مع النصوص والتي تفترض أن عنوان المصدر وعنوان المستودع يتم تحديدهما في هذين المسجلين.
مؤشر التعليمات أو الأوامر Instruction Pointer (IP)
كل المسجلات التي تحدثنا عنها حتى الآن يتم استخدامها في مخاطبة البيانات المخزنة في الذاكرة. لمخاطبة البرنامج يلزم المعالج معرفة عنوان أول أمر في البرنامج المطلوب تنفيذه، بعد ذلك يقوم المعالج بتحديد عنوان الأمر التالي ويستمر في تنفيذ البرنامج.
يتم تخزين الإزاحة للأمر المطلوب تنفيذه في مؤشر التعليمات أو الأوامر Instruction Pointer (IP) حيث يتم ذلك في مقطع البرنامج Code Segment وبالتالي فإن عنوان الأمر المطلوب تنفيذه هو CS:IP. ولا يمكن مخاطبة مؤشر التعليمات مباشرة من داخل البرنامج وإنما يتم تغيير قيمته بطريقة غير مباشرة مثل حالات التفرع إلي عنوان محدد حيث يتم وضع قيمة ذلك العنوان في مؤشر التعليمات وذلك في حالة حدوث عملية التفرع. | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:11 am | |
|
مسجل البيارق Flags Register يحتوي هذا المسجل على مجموعة من البيارق ( الأعلام) وهي نوعان: بيارق الحالة وبيارق التحكم. بالنسبة لبيارق الحالة فهي توضح حالة المعالج بعد تنفيذ كل عملية لتوضيح حالة النتيجة حيث يمكن عن طريق هذه البيارق معرفة النتيجة ( مثلاً إذا كان بيرق الصفر قد تم رفعه فمعنى ذلك أن نتيجة آخر عملية تساوي صفر ) وبالتالي يمكن اختبار البيارق المناسبة واتخاذ القرارات المناسبة. أما بيارق التحكم فيتم استعمالها لإخطار المعالج بالقيام بشيء محدد مثلاً يمكن استخدام بيرق
المقاطعة Interrupt Flag ووضع القيمة صفر فيه وبالتالي فإننا نطلب من المعالج أن يتجاهل نداءات
المقاطعة الواردة إليه من لوحة المفاتيح مثلاً ( أي لا يتم استقبال مدخلات من لوحة المفاتيح ) وسيتم التحدث عن هذه البيارق بالتفصيل لاحقاً.
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:18 pm عدل 1 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الأربعاء فبراير 20, 2008 5:12 am | |
| تنظيم الذاكرة في الحاسب الشخصي
Memory Organization
يتعامل المعالج 8088 مع ذاكرة بطول 1Mbyte.ولا يمكن استخدام كل الذاكرة في البرامج التي يتم كتابتها ولكن هناك مناطق في الذاكرة محجوزة لأغراض محددة فمثلا لدينا الجزء الأول من الذاكرة بطول 1KByte محجوز لعناوين نداءات المقاطعة Interrupt Vector Table كذلك هناك أجزاء مخصصة لبرامج النظام الأساسي للإدخال والإخراج BIOS والذي يقوم بعمليات الإدخال و الإخراج في الجهاز؛ و يتم تخزينه داخل ذاكرة قراءة فقط ROM (READ ONLY MEMORY) وهو الذي يقوم ببدء تشغيل الجهاز في المرحلة الأولى.
كذلك توجد منطقة في الذاكرة مخصصة لوحدة العرض الشاشة (VIDEO DISPLAY MEMORY).
[b]موانئ الإدخال والإخراجI/O PORTS
يتعامل المعالج 8088 مع 64KB من عناوين الإدخال والإخراج وذلك للتعامل مع الأجزاء الإضافية والخارجية. وعموما لا يفضل التخاطب مع موانئ الإدخال والإخراج مباشرة إلا في بعض الحالات الخاصة وذلك بسبب احتمال تغير العناوين في بعض الأجهزة ويفضل أن يتم التعامل مع الأجهزة عن طريق نداءات لنظام التشغيل ليقوم هو بهذه المهمة.
[b]تمارين
1-ما هو الفرق بين المعالج 80286 والمعالج 8088 ؟
2- ما هو الفرق بين المسجل والموقع المحدد في الذاكرة ؟
3- اذكر وظائف مسجلات البيانات DX,CX,BX,AX.
4- ما هو العنوان الفيزيائي للموقع المحدد بالعنوان 0A51:CD90 ؟
5- موقع في الذاكرة عنوانه 4A37B احسب:
أ- الإزاحة إذا كان عنوان القطاع هو 40FF.
ب- عنوان القطاع إذا كانت قيمة الإزاحة 123B.6 - ما هي حدود الفقرات في الذاكرة ؟ [/b]
عدل سابقا من قبل zakagadir في الخميس سبتمبر 30, 2010 3:20 pm عدل 3 مرات | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 1:08 am | |
|
الفصل الثالث
مدخل إلي لغة التجميع
بعد توضيح التركيب الداخلي للمعالج 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 هي القيمة الابتدائية للعداد.
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 1:09 am | |
|
ومثال للإيعازات: 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
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 1:11 am | |
| حقل المعاملات Operand Field
يحتوي هذا الحقل علي المعاملات من مسجلات ومتغيرات وثوابت والتي سيتم تنفيذ الأمر الحالي عليها ( مثل عملية الجمع مثلاً ) ويمكن لهذا الحقل أن يحتوي علي قيمتين أو قيمة واحدة أو لا يحتوي علي أي قيمة علي الإطلاق وذلك حسب نوع الأمر المستخدم والأمثلة التالية توضح ذلك الأمر
| المعاملات | NOP | لا توجد معاملات | INC CX | يوجد معامل واحد وهو المسجل CX | ADD Word1 , 2 | يوجد معاملان وهما المتغير Word1 والرقم 2 |
في حالة الحقول ذات المعاملين يكون المعامل الأول هو الذي سيتم تخزين النتيجة فيه ويسمى بالمستودع destination Operand وهو يكون إما أحد المسجلات أو موقع محدد في الذاكرة ( لاحظ أن بعض الأوامر لا تقوم بتخزين النتيجة أصلاً ) أما المعامل الثاني فيحتوي علي المصدر Source Operand وعادة لا يتم تغيير قيمته بعد تنفيذ الأمر الحالي. | |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 1:12 am | |
|
أما بالنسبة للإيعازات فيحتوي المعامل عادة علي معلومات إضافية عن الإيعاز.
حقل التعليقات والملاحظات 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 | ثنائي |
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 1:13 am | |
| 6455 | عشري | -456h | سداسي عشر | FFFFh | خطأ ( لا يبدأ برقم ) | 1,234 | خطأ ( يحتوي على حرف غير رقمي ) | 0ab | خطأ (لم ينتهي بالحرف h أو H) |
الحروف Characters
يتم وضع الحروف والجمل داخل علامات التنصيص مثلاً ‘A’ أو ‘SUDAN’ ويتم داخلياً تحويل الحروف إلي الأرقام المناظرة في كود الـ ASCII بواسطة الـ Assembler وبالتالي تخزينها في الذاكرة وعلى ذلك لا يوجد فرق بين الحرف ‘A’ والرقم 41h ( وهو الرقم المناظر للحرف A في الجدول) وذلك داخل البرنامج أو من ناحية التخزين في الذاكرة.
المتغيــرات VARIABLES
تلعب المتغيرات في لغـة التجميع نفس الدور الذي تلعبه في البرامج باللغات ذات المستوى العالي High Level Programming Languages مثل لغة الباسكال والسي. وعلى ذلك يجب تحديد أسماء المتغيرات المستخدمة في البرنامج ونوع كل متغير حيث سيتم حجز مكان في الذاكرة لكل متغير وبطول يتناسب مع نوع المتغير وذلك بمجرد تعريف المتغير. ويتم استخدام الجدول التالي لتعريف المتغيرات في لغة التجميع حيث يشير كل إيعاز لنوع المتغير المطلوب تعريفه. الايعـــــاز | المعــــــــــــــنــى | DB (Define Byte) | لتعريف متغير حرفي يشغل خانة واحدة في الذاكرة | DW (Define Word ) | لتعريف متغير كلمة يشغل خانتين متتاليتين في الذاكرة | DD (Define Double Word) | لتعريف متغير يشغل أربعة خانات متتالية في الذاكرة | DQ (Define Quad Word) | لتعريف متغير يشغل ثمان خانات متتالية في الذاكرة | DT (Define Ten Bytes) | لتعريف متغير يشغل عشر خانات متتالية في الذاكرة |
في هذا الجزء سنقوم بالتعامل مع المتغيرات من النوع DB و DW.
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:03 am | |
|
المتغيرات الحرفيــة Byte Variables:
يتم تعر يف المتغيرات الحرفية بالصورة التالية:
Name DB Initial_Value مثلاً
Alpha DB 4
يقوم هذا الإيعاز بتعريف متغير يشغل خانه واحدة في الذاكرة واسمه Alpha ويتم وضع قيمه ابتدائيـة مقدارها 4 في هذا المتغير.
يتم استعمال علامة الاستفهام ( ؟) في حالة عدم وجود قيمه ابتدائية للمتغيــر.
مثال: ? DB Byte
القيــم التي يمكن تخزينها في هذا المتغير تتراوح بين 0 و 255 في حالة الأرقام التي يتم تخزينها بدون إشارةUnsigned Numbers و بين 128- و 127+ في حالة الأرقام التي يتــم تخزينها بإشارة Signed Numbers.
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:04 am | |
|
متغيرات الجمل 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 يكون شكل الذاكرة كما يلي:
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:06 am | |
|
المحتوي | العنوان | الاسم ( الرمز 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. الرسائل والنصوصCharacter Strings
يتم تخزين النصوص علي أنها سلسلة من الحروف ويتم وضع القيمة الابتدائية في صورة حروف أو القيم المناظرة للحروف في جدول الحروف ASCII Table فمثلاً التعريفان التاليان يؤديان إلي نفس النتيجة وهي تعريف متغير اسمه Letters ووضع القيمة الابتدائية ‘ABC” فيه
1 - Letters db ‘ABC’
2 – Letters db 41h, 42h,43h
ويمكن دمج القيمة الابتدائية لتحوي الحروف والقيم المناظرة لها كما في المثال التالي
msg db 0dh,0ah,’Sudan$’
ويتم هنا بالطبع التفرقة بين الحروف الكبيرة Capital Letters والحروف الصغيرة Small Letters.
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:08 am | |
| [b]الثوابت
يتم عادة استخدام الثوابت لجعل البرنامج أسهل من حيث القراءة والفهم وذلك بتعريف الثوابت المختلفة المستخدمة في البرنامج. يتم استخدام الإيعاز EQU (EQUate ) لتعريف الثوابت علي النحو التالي:
name EQU Constant
حيث name هو اسم الثابت. مثلاً لتعريف ثابت يسمى LF بقيمة ابتدائية 0Ah نكتب LF EQU 0Ah
وبالتالي يمكن استخدام الثابت LF بدلاً عن الرقم 0Ah كالآتي MOV AL , LF بدلاً عن استخدام الآتي MOV AL,0Ah. حيث يقوم الـ Assembler بتحويل الثابت LF داخل البرنامج إلي الرقم 0Ah.
كذلك يمكننا استخدام المثال التالي
Prompt EQU ‘Type your Name’
Msg DB prompt
لاحظ أن EQU عبارة عن إيعاز وليس تعليمه أو أمر وبالتالي لا ينتج عنه تعريف متغير ووضعه في الذاكرة.
بعض الأوامر الأساسية
في هذا الجزء سنتعرف علي بعض الأوامر الأساسية وكيفية استخدامها والقيود المختلفة علي استخدامها وسنفترض أن لدينا متغيرات حرفية باسم Byte1 و Byte2 ومتغيرات كلمة باسم Word1 و Word2 ]
[/b]
| |
|
| |
zakagadir Admin
عدد المساهمات : 3267 تاريخ التسجيل : 17/11/2007
| موضوع: رد: لغة التجميع و المعالجات الدقيقة الخميس فبراير 21, 2008 2:11 am | |
|
[b][u]1 – الأمر MOV
يستخدم الأمر MOV في نقل البيانات من مكان لآخر وهذه الأماكن هي المسجلات العامة أو المسجلات الخاصة أو المتغيرات في الذاكرة أو حتى في نقل ( وضع ) قيمة ثابتة في مكان محدد من الذاكرة أو علي مسجل. والصورة العامة للأمر هي [b] MOV Destination , Source
حيث يتم نقل محتويات المصدر Source إلي المستودع Destination ولا تتأثر قيمة المصدر بعد تنفيذ الأمر مثلاً MOV AX , Word1
حيث يتم نسخ محتويات ( قيمة ) المتغير Word1 إلي المسجل AX. وبالطبع يتم فقد القيمة الأولية للمسجل AX بعد تنفيذ الأمر. كذلك الأمر MOV AL, ‘A’
يقوم بوضع الرقم 041h ( وهو الرقم المناظر للحرف A في جدول الـ ASCII ) في المسجل AL.
الجدول التالي يوضح قيود استخدام الأمر MOV
[/b]
| |
|
| |
| لغة التجميع و المعالجات الدقيقة | |
|