النتائج 1 إلى 7 من 7
  1. #1
    تاريخ التسجيل
    Dec 2008
    المشاركات
    21
    الجنس
    أنثى

    Roadblock ترجمة لكتاب الأسمبلي

    السلام عليكــــــــــم
    هذه أشيــــــــاء مســاعدة للمذاكرة قبل الكويز وطبعا مشاركاتي ماتسمحلي أرفع الملف عشان كذه بأنزل الشابترات الي أخذناها على طول في المنتدى

    ياويل الي ماتدعيلي >>> دعـــــــــابة

    بسم الله نبدأ
    المصدر:
    جامعة السودان للعلوم والتكنولوجيا
    كلية العلوم
    قسم الحاسوب
    لغة التجميع و المعالجات الدقيقة
    Assembly Language Programming and Microprocessors
    مارس 1999م
    إعداد : يحي عبد الله محمد


    CHAPTER 3:


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

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

    مواضع المقاطع LOCATIONS OF SEGMENTS
    يتضح مما سبق أن المقطع الأول في الذاكرة يبدأ بالعنوان 0000000 أي 00000 وآخر عنوان داخل المقطع هو العنوان 0000:FFFF أي العنوان 0FFFF بينما يبدأ المقطع الثاني في العنوان 0001000 أي العنوان 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
    وبالتالي فان العنوان هو 125600A

    ب – بإتباع نفس الطريقة التي اتبعناها في الجزء السابق
    افترض أن قيمة الإزاحة المطلوبة X بالتعويض في المعادلة نجد أن
    X +10h *1240 = 1256A
    X +12400 = 1256A
    X = 016A
    وبالتالي فان العنوان هو 124016A
    أي أن العنوانين يشيران إلي نفس العنوان في الذاكرة
    1256A = 125600A = 124016A
    من الممكن أيضاً معرفة رقم المقطع بمعرفة العنوان الفيزيائي وقيمة الإزاحة كما في المثال التالي :
    مثال
    ما هو عنوان المقطع لتحديد العنوان 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 Organization
    يتعامل المعالج 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 - ما هي حدود الفقرات في الذاكرة ؟




    CHAPTER 4 :


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

    بعد توضيح التركيب الداخلي للمعالج 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 Languages مثل لغة الباسكال والسي. وعلى ذلك يجب تحديد أسماء المتغيرات المستخدمة في البرنامج ونوع كل متغير حيث سيتم حجز مكان في الذاكرة لكل متغير وبطول يتناسب مع نوع المتغير وذلك بمجرد تعريف المتغير. ويتم استخدام الجدول التالي لتعريف المتغيرات في لغة التجميع حيث يشير كل إيعاز لنوع المتغير المطلوب تعريفه.
    الايعـــــاز المعــــــــــــــنــى
    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.
    الرسائل والنصوص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.
    الأوامر 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 Languages إلي تعليمات بلغة التجميع.
    إذا افترضنا أن المتغيرين A و B عبارة عن متغيرين من النوع WORD.
    لتحويل العبارة B=A
    لأنه لا يمكن نقل محتويات لمتغير في الذاكرة إلي متغير آخر في الذاكرة مباشرةً يلزم تحويل العبارة إلي نقل قيمة المتغير إلي مسجل ثم نقل قيمة المسجل إلي الرقم المطلوب
    انقل محتويات A الي المسجل AX قبل نقلها الى B MOV AX , A
    MOV B , AX
    أما الأمر A= 5 - A يتم تحويلة إلى الأوامر
    ضع 5 في AX MOV AX , 5
    AX تحتوي علي 5-A SUB AX , A
    ضعها في A MOV A , AX
    أو إلى الأوامر
    NEG A
    ADD A,5
    وأخيراً الأمر A=B-2*A يتم تحويلة إلى الأوامر
    MOV AX,B
    SUB AX,A
    SUB AX, A
    MOV A,AX
    الشكل العام للبرنامج:-
    في الفصل السابق قمنا بتوضيح عملية تقسيم الذاكرة إلى مقاطع مختلفة بحيث يحتوى المقطع الأول علي البرنامج نفسه ويسمى مقطع البرنامج 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
    ; التعليمات والأوامر داخل الإجراء
    MAIN ENDP
    ;بقية الإجراءات تكتب هنا
    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 سيتم التعرف على مزيد من الخدمات لاحقاً بإذن الله

    نداء المقاطع رقم 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 لحرف التحكم
    البرنامج الأول:
    برنامجنا الأول سيقوم بقراءة حرف من لوحة المفاتيح ثم طباعة الحرف الذي تم إدخاله في بداية السطر التالي ثم إنهاء البرنامج.
    يتكون البرنامج من الأجزاء التالية:
    1- إظهار علامة الاستفهام "؟" على الشاشة
    MOV AH,2
    MOV DL,’?’
    INT 21h
    2- قراءة حرف من لوحة المفاتيح
    MOV AH,1
    INT 21h
    3- حفظ الحرف الذي تم إدخاله في مسجل آخر BL مثلاً و ذلك لأننا سنستخدم المسجل DL في تحريك المؤشر إلي بداية السطر الجديد وسيؤدي ذلك لتغيير محتويات المسجل AL ( لاحظ أن الخدمة 2 تقوم باستقبال الحرف المطلوب طباعته في المسجل DL وتقوم بإعادة الحرف المطبوع في المسجل AL مما يجعلنا نفقد القيمة المسجلة فيه) وبالتالي يجب تخزين محتوياته في مسجل آخر مثل BL
    MOV BL , AL
    4- لتحريك المسجل إلي بداية السطر الجديد يجب طباعة حرف التحكم
    Carriage Return و Line Feed ويتم ذلك كالآتي
    MOV AH,2
    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 Language ولكنه غير قابل للتنفيذ لأنه لا يحتوي على الشكل المناسب للبرامج القابلة للتنفيذ وذلك للأسباب التالية:
    أ- عدم تعريف مكان تحميل الملف في الذاكرة وبالتالي فإن عمليه العنونة داخل البرنامج لا يمكن تنفيذها.
    ب- بعض الأسماء والعناوين داخل البرنامج تكون غير معرفة بالذات في حالة ربط أكثر من برنامج حيث يتم من أحد البرامج نداء برامج فرعيه أخرى مكتوب في ملف آخر.

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

    4 – تنفيذ البرنامج Run The Program
    لتشغيل البرنامج يتم فقط كتابة اسمه من محث الـDOS
    C:\ASM > first
    ?t
    t
    C:\ASM >
    يقوم البرنامج بطباعة الحرف "؟" والانتظار إلي حين الضغط علي مفتاح من لوحة المفاتيح. يقوم البرنامج بالذهاب إلي بداية السطر الجديد وطباعة الحرف الذي تم الضغط عليه ثم الانتهاء والعودة إلي نظام التشغيل.

    إظهار رسالة علي الشاشة Display String
    في البرنامج السابق تم استخدام الوظيفة رقم 1 من نداء المقاطعة رقم 21h وهي تستخدم لاستقبال حرف من لوحة المفاتيح وكذلك الوظيفة رقم 2 وهي لطباعة حرف علي الشاشة.
    في هذا المثال ولإظهار رسالة كاملة علي الشاشة يتم استخدام الخدمة رقم 9
    خدمة رقم 9 : إظهار رسالة علي الشاشة
    المدخلات : عنوان الإزاحة Offset لبداية الرسالة يتم وضعه في المسجل DX
    ( يجب أن تنتهي الرسالة بالحرف "$" )
    الحرف "$" في نهاية الرسالة لا تتم طباعته علي الشاشة. وإذا احتوت الرسالة علي أي حرف تحكم Control Character فإنه يتم تنفيذه أثناء الطباعة.
    لتوضيح هذه العملية سنقوم بكتابة برنامج يقوم بإظهار الرسالة ‘Hello!’ في الشاشة. يتم تعريف هذه الرسالة في مقطع البيانات بالطرقة التالية
    msg db ‘HELLO!$’
    الأمر LEA
    تحتاج الخدمة رقم 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


  2. #2
    تاريخ التسجيل
    Dec 2008
    المشاركات
    21
    الجنس
    أنثى

    رد: ترجمة لكتاب الأسمبلي

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

    تحيــــــــــــاتي

  3. #3
    تاريخ التسجيل
    Oct 2007
    المشاركات
    1,175
    الجنس
    أنثى

    رد: ترجمة لكتاب الأسمبلي

    جزاك الله خير أختي..


    هذا الكتاب كامل..


    http://www.cksu.com/vb/uploaded/35197/1229551739.rar

  4. #4
    تاريخ التسجيل
    Dec 2008
    المشاركات
    21
    الجنس
    أنثى

    رد: ترجمة لكتاب الأسمبلي

    آميــــــــــــن

    والله يسعدك نزلتيه كامل كنت باانزله شابتر شابتر

    بس ريحتيني

  5. #5

    رد: ترجمة لكتاب الأسمبلي

    هو نفس اللي انا طرحته سابقاً في يومياً طالب << احلف

    Student Services | CS230 Asm Programming and Org IBM PC

    و هذا شرح اخر عربي :

    Student Services | CS230 Assemply Explaination in Arabic

  6. #6
    تاريخ التسجيل
    Oct 2008
    المشاركات
    119
    الجنس
    أنثى

    رد: ترجمة لكتاب الأسمبلي

    ^^^^
    الله يجزاكم خيييييييييير جميعا ..

  7. #7
    تاريخ التسجيل
    Oct 2008
    المشاركات
    42
    الجنس
    أنثى

    رد: ترجمة لكتاب الأسمبلي

    الله يوفقكم جميعاً .. ويسهل عليكم اختباراتكم ..!


ضوابط المشاركة

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