المنتدى بحاجة الى مشرفين ومشرفات لجميع الاقسام لتقديم الطلب في قسم الاقتراحات والشكاوي كلمة الإدارة


الإهداءات


العودة   منتدى الدكتور نوكيا > ~*¤ô§ô¤*~القسـم التقـني والبـرامج ~*¤ô§ô¤*~ > الكتب الالكترونية


إضافة رد
 
LinkBack أدوات الموضوع انواع عرض الموضوع
قديم 18-04-2010, 11:43 AM   #1
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي للمبتدئين تعلم الاسمبلي لغه البرمجيات

 

الفصل الأول
مقدمة

في هذه المحاضرات سنتناول موضوع المعالجات الدقيقة وبرمجتها وسيتم التركيز علي المعالجات المستخدمة في الأجهزة الشخصية Personal Computersوهي المعالجات المصنعة بواسطة شركة Intel والمعالجات المتوافقة معها. وقد تمت الاستعانة بمجموعة من المراجع التي تغطي هذا الموضوع ولكن تم اعتماد المرجع الأول و هو كتاب Assembly DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokia Programming and ***anization of The IBM PCكمرجع أساسي تم اللجوء إليه بصورة أساسية في كتابة هذه المادة هذا بالإضافة إلي مجموعة المراجع الأخرى والتي تم توضيحها في نهاية المادة

الخلفية المطلوبة Background
يجب الإلمام جيدا بكيفية التعامل مع الأنظمة الرقمية المختلفة وبالذات النظام الثنائي والسداسي عشري وإجادة التعامل مع العمليات الحسابية المختلفة من جمع وطرح وضرب وقسمة للأرقام المختلفة في تلك الأنظمة.
كذلك يجب التعرف علي إحدى لغات البرمجة العليا علي الأقل ويفضل أن تكون إحدى اللغات التي تستعمل الهيكلة Structured Programming DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaمثل الباسكال والسي ولكن يمكن بسهولة فهم البرامج بمجرد الإلمام بأي من لغات البرمجة العليا الأخرى. والهدف من ذلك هو كتابة بعض البرامج من خلال استعراض لغة التجميع ويفضل أن تكون لدينا بعض مهارات البرمجة المختلفة.

أسلوب تدريس المادة
سيتم التدريس باستخدام هذه المادة بالإضافة إلي مجموعة من برامج الكمبيوتر المصاحبة. ويتم ذلك عن طريق تدريس محاضرة واحدة أسبوعيا بواقع ساعتين للمحاضرة الواحدة، بالإضافة إلي ثلاثة ساعات عمليه يقوم فيها الطالب بكتابة البرامج المطلوبة في نهاية كل مرحلة. يتم استلام البرامج أسبوعيا وتقييمها بواسطة الأستاذ ويتم ذلك باستخدام شبكة الحاسوب بالقسم.
كما يتم عمل مجموعة من الاختبارات علي مدار فترة تدريس المادة هذا بالإضافة إلي الامتحان النهائي في نهاية الفترة المقررة.
محتويات المادة
تم تقسيم المادة لمجموعة من الفصول، كل فصل يمثل وحدة مستقلة ويجب دراسة الفصول بالترتيب حيث ان كل فصل يعتمد عادة علي الفصل السابق له. ويفضل الإجابة عن كل الأسئلة التي تأتي في نهاية كل فصل كما سيتم طلب كتابة مجموعة من البرامج في نهاية كل فصل. وتتمثل الفصول في الآتي:
الفصل الثاني :يتناول المعالجات الدقيقة بصورة عامة والمعالجات المنتجة بواسطة شركة Intel بصورة خاصة ثم يتعرض للتركيب الداخلي للمعالج 8088 والمسجلات المختلفة به وطريقة التخاطب مع الذاكرة.
الفصل الثالث:يوضح الشكل العام للأوامر في لغة التجميع وتعريف المتغيرات والثوابت بالإضافة إلي التعرف علي مجموعة من الأوامر الأساسية والتعرف علي الشكل العام للبرنامج واستخدام نداءات المقاطعة للقيام بعمليات الإدخال والإخراج. في نهاية الفصل يتم كتابة برامج صغيرة وتجربتها.
الفصل الرابع:يتم فيه التعرف علي مسجل البيارق Flag Register وتأثر البيارق بالعمليات المختلفة وتوضيح حالات الفيضان المختلفة التي قد تحدث بعد تنفيذ عملية محددة.
الفصل الخامس: يتم فيه توضيح أوامر التفرع المختلفة وبعدها يتم التعرف علي كيفية تحويل البرامج الصغيرة من البرامج ذات المستوي العالي High Level DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokia ويتضمن ذلك تحويل أوامر التفرع والتكرار المختلفة إلى لغة التجميع. بعد ذلك تتم كتابة أحد البرامج الكبيرة نسبياً وتوضيح كيفية تحليل البرنامج إلى مرحلة الكتابة للبرنامج
الفصل السادس: يتناول أوامر الحساب والمنطق المختلفة وطريقة استخدامها في التعامل مع المسجلات ويتضمن ذلك أوامر الإزاحة والدوران. في نهاية الفصل تتم كتابة مجموعة من الإجراءات الفرعية لقراءة وكتابة الأرقام في النظامين الثنائي والسداسي عشري.
الفصل السابع: يتناول الحديث بالتفصيل عن المكدس Stack وكيفية التعامل معه، بعد ذلك يتم التعرف على طريقة كتابة البرامج الفرعية
الفصل الثامن: يتم فيه التعرف علي أوامر الضرب والقسمة واستخدام البرامج الفرعية عن طريق كتابتها في ملف مختلف. ويتم كتابة برامج فرعية تقوم بقراءة أرقام عشرية من لوحة المفاتيح وطباعتها في الشاشة.
الفصل التاسع: يتم فيه التعرف علي أنماط العنونة المختلفة والمستخدمة في لغة التجميع كما يتم التعرف علي طريقة التعامل مع المصفوفات المختلفة.
الفصل العاشر: يتم فيه التعرف علي أوامر التعامل مع النصوص وسلاسل الحروف Strings.


الهدف من المادة
في كثير من الأحيان نضطر لكتابة بعض البرامج الخاصة جداً والتي تتعامل مع مكونات النظام من أجهزة مختلفة وعند الانتهاء من دراسة هذه المادة يكون الطالب قد تعرف علي كيفية التعامل مع المعالج الدقيق مباشرة ومعرفة ما يدور في المستوى الأدنى للجهاز Low-Level ويصبح قادراً علي كتابة برامج تتعامل مع النظام في أدق تفاصيله كما يصبح بإمكانه تحليل وفهم أي برنامج كتب بلغة التجميع. ويصبح الطالب جاهزاً لدراسة مادة برمجة النظم Systems Programming.








التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:46 AM   #2
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

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







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:48 AM   #3
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

تابع
للحصول على العنوان الفيزيائي يتم ضرب قيمة المقطع في الرقم 16 ( إزاحته لليسار بمقدار أربعة خانات ثنائية أو خانة واحدة سداسية عشر) ويتم بعد ذلك إضافة قيمة الإزاحة إليه وبالتالي فإن العنوان الفيزيائي المناظر للعنوان AABB:5566 هو:

1
1
1
0
B
B
A
A
6
6
5
5
+
(العنوان الفيزيائي بطول 20 خانة)
6
1
1
0
B
=
وبالتالي يصبح العنوان الفيزيائي = رقم المقطع × 16+ قيمة الإزاحة = B0116

مواضع المقاطع DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaS OF SEGMENTS
يتضح مما سبق أن المقطع الأول في الذاكرة يبدأ بالعنوان 0000:0000 أي 00000 وآخر عنوان داخل المقطع هو العنوان 0000:FFFF أي العنوان 0FFFF بينما يبدأ المقطع الثاني في العنوان 0001:0000 أي العنوان 00010 وينتهي بالعنوان 0001:FFFF أي العنوان 1000F. وكما نرى فإن هناك كثيراً من التداخل في المقاطع داخل الذاكرة. الشكل(1) يوضح الذاكرة وعناوين المقاطع المختلفة بداخلها:


محتويات الذاكرة
العنوان
45
1001F
نهاية المقطع رقم 2
……..
45
1000F
نهاية المقطع رقم 1
……..
35
0FFFF
نهاية المقطع رقم 0
……..
29
00020
بداية المقطع رقم 2
76
00010
بداية المقطع رقم 1
54
00000
بداية المقطع رقم 0

الشكل ( 1 )

في الشكل(1) يتضح أن المقطع يبدأ بعد كل 16 خانة في الذاكرة. وعلى ذلك تسمى كل 16 خانة في الذاكرة بفقرة Paragraph. ويسمى أي من العناوين التي تقبل القسمة على العدد 10h بحدود الفقرات Paragraph Boundaries.
ولأن هنالك تداخلاً في القطاع فان تحديد العنوان الفيزيائي قد يتم بأكثر من طريقة أي عن طريق اكثر من تشكيلة في عنوان المقطع وعنوان الإزاحة. والأمثلة التالية توضح ذلك :

مثال :- قم بتحديد قيمة الإزاحة المطلوبة لتحديد العنوان 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 + الإزاحة، نجد أن
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 والذي سيتم التحدث عنه لاحقاً.

مسجل مقطع البيانات 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 ).

مسجلات المؤشرات والفهرسة Index and Pointer Registers (SP, BP, SI, DI)
يتم استخدام هذه المسجلات مع مسجلات المقاطع التي تحدثنا عنها في الجزء السابق للتخاطب مع عناوين محددة في الذاكرة، وعكس مسجلات المقاطع يمكن إجراء عمليات الحساب والمنطق على هذه المسجلات.
مؤشر المكدس Stack Pointer (SP)
يتم استخدام هذا المسجل مع مقطع المكدس وسيتم التحدث بالتفصيل عن المكدس في الفصول القادمة.
مؤشر القاعدة Base Pointer (BP)
يتم استخدام هذا المسجل أساساً للتخاطب مع البيانات الموجودة في المكدس ولكنه عكس مؤشر المكدس حيث يمكن استخدامه لمخاطبة الذاكرة في مقاطع أخري غير مقطع المكدس.
مسجل فهرسة المصدر Source Index (SI)
يستخدم هذا المسجل في مخاطبة الذاكرة في مقطع البيانات حيث يقوم بالإشارة إلي بداية ( أو نهاية) منطقة محددة من الذاكرة مطلوب التعامل معها؛ وبتغيير قيمة هذا المسجل في كل مرة يتم التعامل مع كل هذه المنطقة من الذاكرة.
مسجل فهرسة المستودع Destination Index (DI)
هذا المسجل يستخدم مثل مسجل فهرسة المصدر SI حيث يشير هذا المسجل إلي عنوان الذاكرة الذي سيتم تخزين البيانات فيه ويتم ذلك عادة باستخدام المقطع الإضافي ES وهناك مجموعة من الأوامر التي تتعامل مع النصوص والتي تفترض أن عنوان المصدر وعنوان المستودع يتم تحديدهما في هذين المسجلين.
مؤشر التعليمات أو الأوامر Instruction Pointer (IP)
كل المسجلات التي تحدثنا عنها حتى الآن يتم استخدامها في مخاطبة البيانات المخزنة في الذاكرة. لمخاطبة البرنامج يلزم المعالج معرفة عنوان أول أمر في البرنامج المطلوب تنفيذه، بعد ذلك يقوم المعالج بتحديد عنوان الأمر التالي ويستمر في تنفيذ البرنامج.
يتم تخزين الإزاحة للأمر المطلوب تنفيذه في مؤشر التعليمات أو الأوامر Instruction Pointer (IP) حيث يتم ذلك في مقطع البرنامج Code Segment وبالتالي فإن عنوان الأمر المطلوب تنفيذه هو CS:IP. ولا يمكن مخاطبة مؤشر التعليمات مباشرة من داخل البرنامج وإنما يتم تغيير قيمته بطريقة غير مباشرة مثل حالات التفرع إلي عنوان محدد حيث يتم وضع قيمة ذلك العنوان في مؤشر التعليمات وذلك في حالة حدوث عملية التفرع.

مسجل البيارق Flags Register
يحتوي هذا المسجل على مجموعة من البيارق ( الأعلام) وهي نوعان: بيارق الحالة وبيارق التحكم. بالنسبة لبيارق الحالة فهي توضح حالة المعالج بعد تنفيذ كل عملية لتوضيح حالة النتيجة حيث يمكن عن طريق هذه البيارق معرفة النتيجة ( مثلاً إذا كان بيرق الصفر قد تم رفعه فمعنى ذلك أن نتيجة آخر عملية تساوي صفر ) وبالتالي يمكن اختبار البيارق المناسبة واتخاذ القرارات المناسبة. أما بيارق التحكم فيتم استعمالها لإخطار المعالج بالقيام بشيء محدد مثلاً يمكن استخدام بيرق المقاطعة Interrupt Flag ووضع القيمة صفر فيه وبالتالي فإننا نطلب من المعالج أن يتجاهل نداءات

المقاطعة الواردة إليه من لوحة المفاتيح مثلاً ( أي لا يتم استقبال مدخلات من لوحة المفاتيح ) وسيتم التحدث عن هذه البيارق بالتفصيل لاحقاً.

تنظيم الذاكرة في الحاسب الشخصي Memory ***anization
يتعامل المعالج 8088 مع ذاكرة بطول 1Mbyte.ولا يمكن استخدام كل الذاكرة في البرامج التي يتم كتابتها ولكن هناك مناطق في الذاكرة محجوزة لأغراض محددة فمثلا لدينا الجزء الأول من الذاكرة بطول 1KByte محجوز لعناوين نداءات المقاطعة Interrupt Vector Table كذلك هناك أجزاء مخصصة لبرامج النظام الأساسي للإدخال والإخراج BIOS والذي يقوم بعمليات الإدخال و الإخراج في الجهاز؛ و يتم تخزينه داخل ذاكرة قراءة فقط ROM (READ ONLY MEMORY) وهو الذي يقوم ببدء تشغيل الجهاز في المرحلة الأولى.
كذلك توجد منطقة في الذاكرة مخصصة لوحدة العرض الشاشة (VIDEO DISPLAY MEMORY).

موانئ الإدخال والإخراجI/O PORTS
يتعامل المعالج 8088 مع 64KB من عناوين الإدخال والإخراج وذلك للتعامل مع الأجزاء الإضافية والخارجية. وعموما لا يفضل التخاطب مع موانئ الإدخال والإخراج مباشرة إلا في بعض الحالات الخاصة وذلك بسبب احتمال تغير العناوين في بعض الأجهزة ويفضل أن يتم التعامل مع الأجهزة عن طريق نداءات لنظام التشغيل ليقوم هو بهذه المهمة.

تمارين
1-ما هو الفرق بين المعالج 80286 والمعالج 8088 ؟
2- ما هو الفرق بين المسجل والموقع المحدد في الذاكرة ؟
3- اذكر وظائف مسجلات البيانات DX,CX,BX,AX.
4-
ما هو العنوان الفيزيائي للموقع المحدد بالعنوان 0A51:CD90 ؟
5- موقع في الذاكرة عنوانه 4A37B احسب:
أ- الإزاحة إذا كان عنوان القطاع هو 40FF.
ب- عنوان القطاع إذا كانت قيمة الإزاحة 123B.
6 -
ما هي حدود الفقرات في الذاكرة ؟







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:51 AM   #4
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

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

بعد توضيح التركيب الداخلي للمعالج 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.







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:54 AM   #5
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

الرسائل والنصوص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.
الثوابت
يتم عادة استخدام الثوابت لجعل البرنامج أسهل من حيث القراءة والفهم وذلك بتعريف الثوابت المختلفة المستخدمة في البرنامج. يتم استخدام الإيعاز 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
1 – الأمر MOV
يستخدم الأمر MOV في نقل البيانات من مكان لآخر وهذه الأماكن هي المسجلات العامة أو المسجلات الخاصة أو المتغيرات في الذاكرة أو حتى في نقل ( وضع ) قيمة ثابتة في مكان محدد من الذاكرة أو علي مسجل. والصورة العامة للأمر هي
MOV Destination , Source
حيث يتم نقل محتويات المصدر Source إلي المستودع Destination ولا تتأثر قيمة المصدر بعد تنفيذ الأمر مثلاً
MOV AX , Word1
حيث يتم نسخ محتويات ( قيمة ) المتغير Word1 إلي المسجل AX. وبالطبع يتم فقد القيمة الأولية للمسجل AX بعد تنفيذ الأمر. كذلك الأمر
MOV AL, ‘A’
يقوم بوضع الرقم 041h ( وهو الرقم المناظر للحرف A في جدول الـ ASCII ) في المسجل AL.
الجدول التالي يوضح قيود استخدام الأمر MOV

المستودع
المصدر
مسجل عام
مسجل مقطع
متغير
(
موقع في الذاكرة)
ثابت
مسجل عام

مسموح
مسموح
مسموح
غير مسموح
مسجل مقطع

مسموح
غير مسموح
مسموح
غير مسموح
متغير ( موقع في الذاكرة)

مسموح
مسموح
غير مسموح
غير مسموح
ثابت

مسموح
غير مسموح
مسموح
غير مسموح

2-
الأمر XCHG (Exchange)
يستخدم الأمرXCHGلاستبدال قيمة مسجلين أو لاستبدال قيمة مسجل مع موقع محدد في الذاكرة (متغير). والصيغة العامة للأمر هي:
XCHG Destination, Source
مثال:
XCHG AH, BL
حيث يتم تبادل قيم المسجلين AH, BL (تصبح قيمة AH تساوى قيمةBL وBL تساوى AH).
مثال:
الأمر التالي يقوم باستبدال قيمة المسجل AX مع المتغير WORD1
XCHG AX, WORD1
الجدول التالي يوضح قيود استخدام الأمر XCHG
المستودع
المصدر
مسجل عام
موقع في الذاكرة
مسجل عام
مسموح
مسموح
موقع في الذاكرة
مسموح
غير مسموح
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
المستودع
المصدر
مسجل عام
موقع في الذاكرة
مسجل عام
مسموح
مسموح
موقع في الذاكرة
مسموح
غير مسموح
ثابت
مسموح
مسموح
لاحظ أنه غير مسموح بالجمع أو الطرح المباشر بين مواقع في الذاكرة في أمر واحد وبالتالي فإن الأمر 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.







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:55 AM   #6
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

الأوامر 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.
تحويل العبارات إلي صورة برامج التجميع:-
لكي يتم التعامل مع الأوامر السابقة سنقوم في هذا الجزء بتحويل بعض العمليات من لغات البرمجة العليا High Level Programming DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokias إلي تعليمات بلغة التجميع.
إذا افترضنا أن المتغيرين 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
الشكل العام للبرنامج:-
في الفصل السابق قمنا بتوضيح عملية تقسيم الذاكرة إلى مقاطع مختلفة بحيث يحتوى المقطع الأول علي البرنامج نفسه ويسمى مقطع البرنامج CODE SEGMENT ومقطع آخر يحتوى علي البيانات المستخدمة في البرنامج ويسمى مقطع البيانات DATA SEGMENT ومقطع ثالث يحتوي علي المكدس ويسمى مقطع المكدس STACK SEGMENT
في هذا الجزء سيتم توضيح كيفية توليد هذه المقاطع بواسطة الـ ASSEMBLER مع توضيح كيفية كتابة وتعريف كل مقطع داخل البرنامج.
نماذج الذاكرة MEMORY MODELS:
كما ذكرنا فيما مضى انه قد يكون البرنامج المطلوب كتابته صغير بحيث يمكن أن يسع مقطع واحد فقط لكل من البرنامج والبيانات والمكدس وقد تحتاج إلي استخدام مقطع منفصل لكل على حده. يتم استعمال الكلمة.MODEL وذلك بكتابة السطر التالي:
.MODEL MEMORY_MODEL
ويتم كتابة هذا السطر قبل تعريف أي نقطة ويوجد لدينا اكثر من نموذج للذاكرة سوف يتم توضيحها في الجدول التالي ولكن عموماً إذا لم يكن حجم البيانات كبيراً يتم غالباً استخدام النموذج SMALL وهذا هو الحال في اغلب البرامج التي سنتطرق لها. ويتم كتابة السطر على الصورة التالية:.MODEL SMALL
الجدول التالي يوضح أسماء موديلات الذاكرة المختلفة وتوضيح خصائص كل منها


الموديل 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
مقطع المكدس 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
الجزء التالي يوضح مقطع برنامج كامل
.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 ) ويتعامل مباشرة مع موانئ الإدخال والإخراج بينما خدمات الـ DOS تقوم بتنفيذ عمليات أكثر تعقيداً مثلاً طباعة سلسلة حروف وهي تقوم عادة باستخدام الـ BIOS في تنفيذ عمليات إدخال/إخراج مباشرة.
يتم نداء الـ BIOS أو الـ DOS لتنفيذ عملية محددة باستخدام نداء مقاطعة INT (INTERRUPT ) والنداء على هذه الصورة
INT INTERRUPT_NUMBER
حيث يتم تحديد رقم نداء المقاطعة وهو رقم محدد مثلاً INT 16h يقوم بطلب خدمة في الـ BIOS وهى خاصة بقراءة قيمة في لوحة المفاتيح و INT 21h خاص بنداء خدمة من الـ DOS سيتم التعرف على مزيد من الخدمات لاحقاً بإذن الله







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:56 AM   #7
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

نداء المقاطع رقم 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 علي القيمة صفر. التعليمات التي تلي 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 لحرف التحكم
البرنامج الأول:
برنامجنا الأول سيقوم بقراءة حرف من لوحة المفاتيح ثم طباعة الحرف الذي تم إدخاله في بداية السطر التالي ثم إنهاء البرنامج.
يتكون البرنامج من الأجزاء التالية:
إظهار علامة الاستفهام "؟" على الشاشة
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
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
ولأنه لم يتم استخدام المتغيرات فقد حذف قطاع البيانات في هذا البرنامج


إنشاء وتشغيل البرنامج:-
في هذا الجزء سنوضح طريقة إنشاء و تجهيز البرنامج للتشغيل حيث يتضمن ذلك الخطوات التالية:-
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.

3-
ربط البرنامج Linking the program
الملف الذي تم إنشاؤه في الخطوة السابقة هو ملف بلغة الآلة Machine DrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokiaDrNokia ولكنه غير قابل للتنفيذ لأنه لا يحتوي على الشكل المناسب للبرامج القابلة للتنفيذ وذلك للأسباب التالية:
أ- عدم تعريف مكان تحميل الملف في الذاكرة وبالتالي فإن عمليه العنونة داخل البرنامج لا يمكن تنفيذها.
ب- بعض الأسماء والعناوين داخل البرنامج تكون غير معرفة بالذات في حالة ربط أكثر من برنامج حيث يتم من أحد البرامج نداء برامج فرعيه أخرى مكتوب في ملف آخر.

برنامج الربط Link Program يقوم بإجراء عملية الربط بين الـ Object Files المختلفة وتحديد العناوين داخل البرنامج ويقوم بعد ذلك بإنتاج ملف قابل للتنفيذ. EXE (Executable File) على النحو التالي:
> TLINK First;
Turbo Link Version 2.0 Copyright (c) 1987 Borland International.







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:57 AM   #8
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

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
تحتاج الخدمة رقم 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 ; احصل علي الرسالة
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
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
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








التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 11:59 AM   #9
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

الفصل الرابع
مسجل البيارق


أحد أهم مميزات الحاسب هي القدرة علي اتخاذ القرارات ويتم ذلك عن طريق تحديد حالة المعالج الدقيق بعد تنفيذ عملية محددة. في المعالج 8086 يتم تمثيل حالة المعالج بعد تنفيذ آخر عملية في 9 خانات ثنائية تسمي البيارق Flags ويتم اتخاذ القرارات المختلفة حسب قيمة هذه البيارق.
يتم تخزين البيارق في مسجل يسمي مسجل البيارق Flag Register ويمكن تقسيم البيارق إلي نوعين وهما بيارق التحكم Control Flags وبيارق الحالة Status Flags. وتقوم بيارق التحكم لتشغيل أو تعطيل عمليات محددة أثناء تنفيذ البرنامج بينما تقوم بيارق الحالة بعكس حالة المعالج بعد تنفيذ أمر محدد كأن يتم إظهار أن النتيجة تساوي صفر وذلك عن طريق رفع بيرق الصفر كما سنري في الجزء التالي.

مسجل البيارق
يحتوي هذا المسجل علي البيارق المختلفة كما هو موضح بالشكل حيث يتم تمثيل بيارق الحالة في الخانات 0 و 2 و 4 و 6 و 7 و 11 بينما تشغل بيارق التحكم الخانات 8 و 9 و 10 وتبقي بقية الخانات بدوت استخدام ( ليس من الضروري معرفة موقع البيرق من المسجل في أغلب الحالات حيث توجد أوامر للتخاطب مع كل بيرق علي حدة )، سنتناول في الجزء التالي بيارق الحالة

Cf
Pf
Af
Zf
Sf
Tf
If
Df
Of
شكل يوضح مسجل البيارق
بيارق الحالة Status Flags
تقوم هذه البيارق بإظهار حالة المعالج بعد تنفيذ آخر أمر فمثلاً عند تنفيذ الأمر SUB Ax,Bx فإن بيرق الصفر يتأثر وتصبح قيمته تساوي 1 إذا كانت النتيجة تساوي صفر. الجدول التالي يوضح البيارق المختلفة





بيارق الحالة Status Flags
الرمز
الاسم
Name
الخانة
CF
بيرق المحمول
Carry Flag
0
PF
بيرق خانة التطابق
Parity Flag
2
AF
بيرق المحمول المساعد
Auxiliary Carry Flag
4
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 ) وعلي ذلك إذا أردنا إجراء عملية حسابية وزاد الناتج عن هذه القيمة فإن المكان لن يسمح بتخزين النتيجة وفي هذه الحالة يكون قد حدث فيضان.
أمثلة علي الفيضان
يختلف الفيضان عند التحدث عن الأرقام الموجبة فقط ( الأرقام بدون إشارة ) 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
وبالتالي يكو لدينا أحد احتمالين
إذا فسرنا هذه الأرقام علي أنها أرقام بدون إشارة فإن النتيجة الصحيحة هي الرقم 65536 أي الرقم السداسي عشر 10000h ولكن هذه النتيجة لا يمكن تخزينها في المسجل ( أكبر من أكبر رقم يمكن تخزينه 65535 ) حيث سيتم فقد الرقم 1 وتخزين الرقم 0000h في المسجل AX وبالتالي فإن النتيجة التي تم تسجيلها هي نتيجة خاطئة.
أما إذا فسرنا هذه الأرقام علي أنها أرقام بإشارة فإن الرقم الأول 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
وتصبح وظيفة البرنامج التأكد من حدوث أي من أنواع الفيضانات التي ذكرناها واتخاذ الإجراءات المناسبة. وإذا تم تجاهل هذه البيارق وحدث فيضان فقد تكون النتيجة غير صحيحة.
وعلي هذا فإن المعالج لا يفرق بين الأرقام بإشارة أو بدون إشارة فهو فقط يقوم برفع البيارق لبيان حدوث أي من الفيضان بإشارة أو بدون إشارة. فإذا كنا في البرنامج نتعامل مع الأرقام علي أنها بدون إشارة فإننا نهتم ببيرق المحمول فقط 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 والمحمول من الخانة ذات الوزن الأكبر مختلفان ( ويعني هذا أنه يوجد محمول إليها ولا يوجد محمول منها أو لا يوجد محمول إليها ولكن يوجد محمول منها ). في هذه الحالة يتم رفع بيرق الفيضان ( أنظر الأمثلة لاحقاً ).

كيف تؤثر العمليات علي البيارق:
عندما يقوم المعالج بتنفيذ أي أمر يتم رفع البيارق المناسبة لتوضيح النتيجة . وعموماً هناك أوامر لا تؤثر في كل البيارق وإنما تؤثر في بعضها فقط إذ قد تترك كل البيارق دون تأثير . وعموماً فإن عملية تفرع البرنامج باستخدام أوامر التفرع 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 :يساوي صفر لأن إشارة النتيجة هي نفس إشارة الأرقام التي تم جمعها
( المحمول إلي الخانة MSB لا يختلف عن المحمول من الخانة MSB ).
مثال 2 :
نفذ الأمر ADD AL,BL حيث يحتوي AL علي الرقم 80h و BL علي الرقم 80h







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
قديم 18-04-2010, 12:01 PM   #10
administrator
 
الصورة الرمزية جمال الزرقاء
 
تاريخ التسجيل: Dec 2005
رقم العضوية: 1927
الدولة: بداخل الالكترونيات
العمر: 35
المشاركات: 2,913
بمعدل: 0.89 (مشاركة/اليوم)



افتراضي

 

الحل :
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 .بعد تنفيذ هذه العملية نجد أن

بيرق الإشارة 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
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

يقوم البرنامج بالرد بالإشارة "-" دليل علي أنه في حالة انتظار لأحد الأوامر وهنا توضيح لبعض الأوامر الهامة :-
الأمر Rوهو يوضح محتويات المسجلات . ولوضع قيمة محددة في أحد المسجلات يتم كتابة الأمر R متبوعاً بإسم المسجل (مثلاُ R IP).
الأمر T (TRACE) وهو يؤدي إلي تنفيذ الخطوة الحالية فقط من البرنامج .
الأمر G ( GO ) يؤدي إلي تنفيذ البرنامج .
الأمر Q (QUIT) يؤدي إلي الخروج من البرنامج .
الأمرA ASSEMBLE يتيح فرصة كتابة برنامج .
الأمر Uلرؤية جزء من الذاكرة .
الأمر D DUMB يؤدي إلي إظهار جزء من الذاكرة .

لتجربة برنامج Debug دعنا نتابع تنفيذ البرنامج التالي:

MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AX , 4000H ;ax = 4000h
ADD AX , AX ;ax = 8000h
SUB AX , 0FFFFH ;ax = 8001h
NEG AX ;ax = 7fffh
INC AX ;ax = 8000h
MOV AH , 4CH
INT 21H ;DOS exit
MAIN ENDP
END MAIN

بعد كتابة البرنامج السابق وليكن اسمه test.asm وتوليد الملف القابل للتنفيذ Executable file والذي سيحمل الاسم Test.exe يتم نداء برنامج Debug وتحميل البرنامج وذلك بتنفيذ الأمر التالي من محث الـ DOS: c:\asm> DEBUG TEST.EXE
يقوم البرنامج بالتحميل وإظهار المؤشر "-" والذي تشير للاستعداد لتلقي الأوامر.
نبدأ بتجربة الأمر R وذلك لإظهار محتويات المسجلات المختلفة وتكون المخرجات علي الصورة التالية:




يقوم البرنامج بإظهار محتويات المسجلات المختلفة وفي السطر الثالث يوضح عنوان الأمر التالي (المطلوب تنفيذه - لاحظ قيمة العنوان ومحتويات المسجلين CS:IP ) متبوعاً بكود الآلة للأمر Machine Code وهو الرقم B80040 وبعد ذلك نجد الأمر مكتوباً بلغة التجميع.
عند تشغيل البرنامج ستجد أرقام مختلفة عن الأرقام الموضحة في هذا المثال وبالذات محتويات المسجلات المختلفة.
في نهاية السطر الثاني يوجد عدد 8 أزواج حروف عل الصورة NV UP DI PL NZ NA PO NC توضح محتويات البيارق المختلفة وذلك حسب الجدول التالي:

البيرق
في حالة رفع البيرق Set
في حالة عدم رفع البيرق Clear
CF (CarryFlag)
CY (CarrY)
NC (No Carry)
PF (Parity Flag)
PE (Parity Even)
PO (Parity Odd)
AF (Auxiliary Flag)
AC (Auxiliary Carry)
NA (No Auxiliary carry)
ZF (Zero Flag)
ZR (ZeRo)
NZ (NonZero)
SF (Sign Flag)
NG (NeGative)
PL (Plus)
OF (Overflow Flag)
OV (OVerflow)
NV (No oVerflow)
بيارق التحكم Control Flags
DF (Direction Flag)
DN (DowN)
UP (UP)
IF ( Interrupt Flag )
EI (Enable Interrupt)
DI (Disable Interrupt)

لبداية تشغيل البرنامج نصدر الأمر T أي Trace للتنفيذ خطوة خطوة فيكون التسلسل التالي للأوامر :
في البداية كانت المسجلات علي النحو التالي (سنكرر الشاشة السابقة حتى نتابع التنفيذ بالتفصيل





ثم نبدأ التنفيذ: الأمر الأول MOV AX , 4000h



التنفيذ يضع 4000h في المسجل AX
لاحظ أن المسجل AX أصبح به الرقم 4000H ولم يتم تغيير محتويات البيارق وأن الأمر التالي أصبح الأمر ADD AX,AX



لاحظ أن المسجل AX أصبح به الرقم 8000H وأن النتيجة السابقة أثرت في البيارق حيث تم رفع بيرق الفيضان ليشير إلي حدوث فيضان بإشارة وبيرق الإشارة ليشير إلي أن النتيجة سالبة وكذلك بيرق التطابق لأن الخانة الأصغر من المسجل AX (أي AL) تحتوي علي عدد زوجي من الخانات التي بها الرقم 1 . والآن نتابع تنفيذ البرنامج حيث الأمر التالي هو الأمر SUB AX,FFFFh



















تمارين :
وضع محتويات المسجل المستودع DESTINATION REG وكذلك قيم البيارق بعد تنفيذ كل من الأوامر التالية .
ADD AX,BX حيث يحتوي المسجل AX علي الرقم 7FFFh والمسجلBX علي 0001h.
SUB AL,B حيث AL=01h و BL=FFh
DEC AL حيث AL=00h
NEG AL حيث AL=7F
XCHG AX,BX حيث AX=1ABCh و BX=712h .
ADD AL,BL حيث AL=80h و BL=FFh .
SUB AX,BX حيث AX=0000h و BX=8000h .
NEG AX حيث AX=0001h .

2-أفترض ان المسجلين BX AX يحتويان علي أرقام موجبة . وتم تنفيذ الأمر ADD AX,BX وضح أنه يوجد محمول إلي الخانة MSB ولا يوجد محمول منها وذلك فقط في حالة حدوث فيضان بإشارة .
أفترض ان المسجلين BX AX يحتويان علي أرقام سالبة . وتم تنفيذ الأمر ADD AX,BX وضح أنه يوجد محمول من الخانة MSB ولا يوجد محمول إليها وذلك فقط في حالة حدوث فيضان بإشارة .

3- أفترض أن الأمر ADD AX,BX تم تنفيذه إذا كانت محتويات المسجل AX هي الرقم الأول بينما المسجل BX به الرقم التالي . وضح محتويات المسجل AX في كل من الحالات الآتية موضحاُ حدوث فيضان بإشارة أو بدون إشارة .
أ. 512Ch ب.FE12h ج. E1E4h د. 7132h هـ. 6389h
4185h+ 1ACBh+ DAB3h+ 7000h+ 1176h+
4- أفترض أن الأمر SUB AX,BX تم تنفيذه إذا كانت محتويات المسجل AX هي الرقم الأول بينما المسجل BX به الرقم التالي . وضح محتويات المسجل AX في كل من الحالات الآتية موضحاُ حدوث فيضان بإشارة أو بدون إشارة .
أ. 2143h ب. 81Feh ج. 19BCh د. 0002h هـ 88CDh
-1986h -1986h -81Feh FE0Fh 71ABh







التوقيع
جمال الزرقاء غير متواجد حالياً  
Digg this Post!Bookmark Post in Technorati
رد مع اقتباس
إضافة رد


يتصفح الموضوع حالياً : 1 (0 عضو و 1 ضيف)
 
أدوات الموضوع
انواع عرض الموضوع

ضوابط المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا يمكنك اضافة مرفقات
لا يمكنك تعديل مشاركاتك

BB code متاحة
كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة



جميع الأوقات بتوقيت GMT +4. الساعة الآن 03:08 AM.

 

 
 

SEO by vBSEO 3.5.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425