You are on page 1of 25

‫الفصل الثالث‬

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


‫بعد توضيح التركيب الداخلي للمعالج ‪ 8088‬والتعرف على المسجلت‬
‫المختلفة الموجودة به سنتناول في هذا الفصل كيفية كتابة وتجهيز‬
‫وتشغيل برنامج لغة التجميع وبنهاية الفصل سنستطيع أن نكتب برنامج‬
‫لغة تجميع وان نقوم بتشغيله ورؤية النتيجة‪.‬‬
‫كأي لغة سنبدأ بتوضيح الصيغة العامة للوامر وهى صيغه بسيطة جدا ً‬
‫في لغة التجميع‪ .‬بعدها سنوضح طريقة تعريف المتغيرات داخل‬
‫البرنامج وبعدها نستعرض بعض أوامر نقل البيانات وأوامر العمليات‬
‫الحسابية البسيطة‪ .‬في النهاية سنستعرض الشكل العام للبرنامج‬
‫والذي ستلحظ أنه يتكون من جزء خاص بالوامر وجزء ثاني خاص‬
‫بالبيانات وجزء أخير خاص بالمكدس‪ ،‬سيتم استخدام بعض النداءات‬
‫البسيطة لنظام التشغيل ليقوم بتنفيذ عمليات الدخال والخراج‪.‬‬
‫في النهاية سيتم توضيح كيفية تحويل برنامج لغة التجميع إلى لغة اللة‬
‫وتشغيل البرنامج في صورته النهائية‪.‬‬
‫تعليمات لغة التجميع‪-:‬‬
‫يتم تحويل برنامج لغة التجميع للغة اللة بواسطة برنامج يسمى‬
‫‪ Assembler‬وبالتالي يجب كتابة التعليمات بصوره محدده حتى يتعرف‬
‫عليها الـ ‪ ،Assembler‬وفى هذا الجزء سنتناول الشكل العام للوامر‬
‫المستخدمة‪.‬‬
‫يتكون البرنامج من مجموعه من التعليمات أو الوامر بحيث يحتوى‬
‫كل سطر على أمر واحد فقط كما أن هنالك نوعين من التعليمات‪.‬‬
‫الوامر أو التعليمات ‪ Instructions‬والتي يقوم الـ ‪ Assembler‬بتحويلها إلي‬
‫لغة اللة واليعازات ‪ Assembler-Directives‬وهى إيعازات للـ ‪Assembler‬‬
‫للقيام ببعض العمليات المحددة مثل تخصيص جزء من الذاكرة لمتغير‬
‫محدد وتوليد برنامج فرعى‪.‬‬
‫كل الوامر في لغة التجميع تأخذ الصورة‬
‫‪NAME‬‬ ‫‪OPERATION‬‬ ‫)‪OPERAND(S‬‬ ‫‪COMMENT‬‬
‫المسطرة)‬ ‫مفتاح الـ ‪ TAB‬أو‬
‫• يتم الفصل بين الحقول بواسطة‬
‫‪ (SPACE‬أي يكون هناك فراغ واحد على القل بين كل حقل والحقل‬
‫التالي‪.‬‬
‫• يتم استخدام السم ‪ NAME‬في حالة حدوث عملية تفريع لهذا‬
‫المر ) لهذا السطر من البرنامج( في جزء ما من البرنامج وهو‬
‫حقل اختياري‪.‬‬
‫• الحقل ‪ Operation‬يحتوى على المر المطلوب تنفيذه‪.‬‬

‫‪- 16 -‬‬ ‫‪SUST‬‬


‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫• الحقل ‪ (Operation(s‬يحتوى على المعامل أو المعاملت المطلوب‬
‫تنفيذها بواسطة المر المحدد ويعتمد على نوع المر‪) .‬لحظ أن‬
‫هناك بعض الوامر ل تتطلب وجود هذا الحقل(‪.‬‬
‫• حقل الملحوظات الـ ‪ Comments‬يستخدم عادة للتعليق على المر‬
‫الحالي وهو يستخدم لتوثيق البرنامج‪.‬‬
‫كمثال للتعليمات‬
‫‪Srart: MOV CX , 5 ; initialize counter‬‬
‫‪CX‬‬ ‫والمعاملت هي‬ ‫عنوان ‪ Start‬والمر المستخدم ‪MOV‬‬
‫هذه المر ذو‬
‫والرقم ‪ 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‬‬

‫‪-17-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪Operand Field‬‬ ‫حقل المعاملت‬
‫يحتوي هذا الحقل علي المعاملت من مسجلت ومتغيرات‬
‫وثوابت والتي سيتم تنفيذ المر الحالي عليها ) مثل عملية‬
‫الجمع مثل ً ( ويمكن لهذا الحقل أن يحتوي علي قيمتين أو قيمة‬
‫واحدة أو ل يحتوي علي أي قيمة علي الطلق وذلك حسب نوع‬
‫المر المستخدم والمثلة التالية توضح ذلك‬
‫المعاملت‬ ‫المر‬
‫ل توجد معاملت‬ ‫‪NOP‬‬
‫يوجد معامل واحد وهو المسجل ‪CX‬‬ ‫‪INC CX‬‬
‫يوجد معاملن وهما المتغير ‪ Word1‬والرقم ‪2‬‬ ‫‪ADD 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‬‬

‫‪-18-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪MOV BX, 0‬‬
‫‪Program Data‬‬ ‫البيانات المستخدمة في البرنامج‬
‫يقوم البرنامج بالتعامل مع البيانات في صورة أرقام ثنائية وفــي‬
‫برامج لغة التجميع يتم التعامل مع الرقام فــي الصــورة الثنائيــة‬
‫أو السداسية عشر أو العشرية أو حتى في صورة حروف‪.‬‬
‫‪Numbers‬‬ ‫العداد‬
‫‪b‬‬ ‫أو‬‫• يتم كتابة الرقام الثنائية في صورة ‪ 0‬و ‪ 1‬وتنتهي الحرف‬
‫‪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‬‬

‫رقمي (‬
‫خطأ )لم ينتهي بالحرف ‪ h‬أو ‪(H‬‬ ‫‪0ab‬‬

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

‫‪-19-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫تلعب المتغيرات في لغـة التجميع نفس الدور الذي تلعبه في‬
‫البرامج باللغات ذات المستوى العالي ‪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‬في هذا‬
‫المتغير‪.‬‬
‫يتم استعمال علمة الستفهام ) ؟( في حالة عدم وجود قيمه‬
‫ابتدائية للمتغيــر‪.‬‬
‫‪Byte‬‬ ‫‪DB‬‬ ‫?‬ ‫مثال‪:‬‬
‫القيــم التي يمكن تخزينها في هذا المتغير تتراوح بين ‪ 0‬و ‪255‬‬
‫في حالة الرقام التي يتم تخزينها بدون إشارة ‪Unsigned Numbers‬‬
‫و بين ‪ -128‬و ‪ +127‬في حالة الرقام التي يتــم تخزينها‬
‫بإشارة ‪.Signed Numbers‬‬

‫‪Word Variables‬‬ ‫متغيرات الجمل‬

‫‪-20-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫يتم تعريف المتغير علي أنه من النوع ‪ Word‬ويتم تخزينه في‬
‫خانتين من الذاكرة ‪ Two Bytes‬وذلك باستخدام الصيغة‬
‫‪name DW‬‬ ‫‪initial_value‬‬
‫مثل ً التعريف التالي‬
‫‪WRD‬‬ ‫‪DW‬‬ ‫‪-2‬‬
‫ووضع قيمة ابتدائية‬ ‫يتم فيه تعريف متغير باسم‬
‫‪WRD‬‬
‫) الرقم –‪ ( 2‬فيه‬
‫كما في حالة المتغيرات الحرفية يتم وضع العلمة ؟ في‬
‫حالة عدم وجود قيمة ابتدائية للمتغير‪.‬‬
‫يمكن للمتغير من النوع ‪ word‬تخزين أرقام تتراوح بين ‪ 0‬و‬
‫‪ ( 1– 216 ) 65535‬في حالة الرقام بدون إشارة‬
‫) الموجبة فقط (‪Unsigned Numbers‬‬
‫‪15‬‬
‫ويمكن تخزين الرقام من –‪ ( 2 - ) 32768‬وحتى ‪32767‬‬
‫) ‪ ( 1 - 215‬في حالة الرقام بإشارة‬
‫) الموجبة والسالبة (‪.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‬‬
‫‪B_ARRAY‬‬ ‫‪200h0‬‬ ‫‪10h‬‬
‫‪B_ARRAY + 1‬‬ ‫‪0201h‬‬ ‫‪20h‬‬
‫‪B_ARRAY + 2‬‬ ‫‪0202h‬‬ ‫‪30h‬‬

‫وبنفس الطريقة يتم تعريف مصفوف مكون من كلمات فمثل ً‬


‫التعريف‬
‫‪W_ARRAY‬‬ ‫‪DW‬‬ ‫‪1000h, 2000h, 3000h‬‬
‫و‬ ‫يقوم بتعريف مصفوف يحتوي علي ثلثة عناصر بقيم ابتدائية‬
‫‪1000h‬‬
‫‪ 2000h‬و ‪ 3000h‬علي الترتيب‪ .‬يتم تخرين القيمة الولى ) ‪( 1000h‬في‬
‫العنوان ‪ W_ARRAY‬والقيمة الثانية في العنوان ‪ W_ARRAY +2‬والقيمة‬

‫‪-21-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫الثالثة في العنوان ‪ W_ARRAY + 4‬وهكذا‪ .‬فمثل ً لو تم تخزين المصفوف‬
‫في الذاكرة بدءا ً من العنوان ‪ 300h‬يكون شكل الذاكرة كما يلي‪:‬‬

‫السم ) الرمز‬ ‫العنوان‬ ‫المحتوي‬


‫‪( Symbol‬‬
‫‪W_ARRAY‬‬ ‫‪0300h‬‬ ‫‪1000h‬‬
‫‪W_ARRAY + 2‬‬ ‫‪0302h‬‬ ‫‪2000h‬‬
‫‪W_ARRAY + 4‬‬ ‫‪0304h‬‬ ‫‪3000h‬‬

‫لحظ أن للمتغيرات من هذا النوع يتم تخزينها في الذاكرة في خانتين‬


‫حيث يتم تخزين الخانة ذات الوزن القل ‪ 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‬‬


‫بقيمة‬ ‫‪LF‬‬ ‫حيث ‪ name‬هو اسم الثابت‪ .‬مثل ً لتعريف ثابت يسمى‬
‫ابتدائية ‪ 0Ah‬نكتب‬

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

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

‫‪-23-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫غير‬ ‫مسموح غير مسموح‬ ‫مسموح‬ ‫موقع‬ ‫متغير )‬
‫مسموح‬ ‫في الذاكرة(‬
‫غير‬ ‫مسموح‬ ‫غير‬ ‫مسموح‬ ‫ثابت‬
‫مسموح‬ ‫مسموح‬

‫‪ -2‬المر ‪(XCHG (Exchange‬‬


‫يستخدم المر ‪ XCHG‬لستبدال قيمة مسجلين أو لستبدال قيمة‬
‫مسجل مع موقع محدد في الذاكرة )متغير(‪ .‬والصيغة العامة‬
‫للمر هي‪:‬‬
‫‪XCHG Destination, Source‬‬
‫مثال‪:‬‬
‫‪XCHG AH, BL‬‬
‫تساوى‬ ‫‪AH‬‬ ‫)تصبح قيمة‬ ‫‪AH, BL‬‬ ‫حيث يتم تبادل قيم المسجلين‬
‫قيمة ‪ BL‬و ‪ BL‬تساوى ‪.(AH‬‬
‫مثال‪:‬‬
‫مع المتغير‬ ‫‪AX‬‬ ‫المر التالي يقوم باستبدال قيمة المسجل‬
‫‪WORD1‬‬
‫‪XCHG AX, WORD1‬‬

‫‪XCHG‬‬ ‫الجدول التالي يوضح قيود استخدام المر‬


‫المستودع‬
‫لحظ عدم السماح للتعليمتين ‪ MOV‬أو‬
‫‪ XCHG‬بالتعامل مع موقعين في الذاكرة في‬
‫موقع‬
‫‪MOV‬‬ ‫مسجل‬
‫‪Word1,Word2‬‬ ‫المصدر واحد مثل‬
‫أمر‬
‫في مسجل‬‫عامهذا القيد باستخدام‬
‫ولكن يمكن تفادي‬
‫وسيط فيصبح المر كما يلي‪:‬‬
‫الذاكرة‬ ‫‪Mov AX , Word2‬‬
‫‪Mov Word1 , AX‬‬
‫مسموح مسموح‬ ‫مسجل‬
‫عام‬
‫موقع في مسموح غير‬
‫مسموح‬ ‫الذاكرة‬
‫‪ - 3‬العمليات الحسابية ‪:ADD, SUB, INC, DEC, NEG‬‬
‫يتم استخدام المرين ‪ ADD‬و ‪ SUB‬لجمع أو طرح محتويات‬
‫مسجلين أو مسجل وموقع في الذاكرة أو موقع في الذاكرة مع‬
‫مسجل أو مسجل مع موقع في الذاكرة والصيغة العامة‬
‫للمرين هي‪-:‬‬
‫‪ADD‬‬ ‫‪Destination, Source‬‬
‫‪SUB‬‬ ‫‪Destination, Source‬‬

‫‪-24-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫مثل ً المر‬
‫‪ADD WORD1, AX‬‬
‫‪WORD1‬‬ ‫قيمة المتغير‬ ‫محتويات المسجل ‪ AX‬إلي‬ ‫يقوم بجمع‬
‫ويتم تخزين النتيجة في المتغير ‪) WORD1‬ل يتم تغيير قيمة‬
‫محتويات المسجل ‪ AX‬بعد تنفيذ المر( كذلك المر‬
‫‪SUB AX, DX‬‬
‫ويتم‬ ‫‪ DX‬من المسجل ‪AX‬‬
‫حيث يتم طرح محتويات المسجل‬
‫تخزين النتيجة في المسجل ‪) AX‬لحظ أن محتويات المسجل‬
‫‪ DX‬ل تتغير بعد تنفيذ المر(‬
‫و‬ ‫‪ADD‬‬ ‫الجدول التالي يبين قيود استعمال المرين‬
‫‪SUB‬‬
‫المستودع‬
‫موقع في‬ ‫مسجل‬ ‫المصدر‬
‫الذاكرة‬ ‫عام‬
‫مسموح‬ ‫مسموح‬ ‫مسجل‬
‫عام‬
‫غير مسموح‬ ‫مسموح‬ ‫موقع في‬
‫الذاكرة‬
‫مسموح‬ ‫مسموح‬ ‫ثابت‬
‫لحظ أنه غير مسموح بالجمع أو الطرح المباشر بين مواقع في‬
‫الذاكرة في أمر واحد وبالتالي فإن المر ‪ ADD BYTE1, BYTE2‬غير‬
‫مسموح به ولكن يمكن إعادة كتابته على الصورة‪:‬‬
‫قبل ; ‪MOV AL, BYTE2‬‬ ‫حيث يتم قيمة المتغير إلى مسجل‬
‫عملية الجمع‬
‫‪ADD‬‬ ‫‪BYTE1, AL‬‬
‫‪BL‬‬ ‫المر ‪ ADD BL,5‬يقوم بجمع الرقم ‪ 5‬إلى محتويات المسجل‬
‫وتخزين النتيجة في المسجل ‪.BL‬‬
‫كملحظة عامه نجد انه يجب أن يكون المتغيرين لهما نفس‬
‫الطول بمعني أن المر التالي غير مقبول‬
‫‪MOV AX ,BYTE1‬‬
‫‪AX‬‬ ‫وذلك لن طول المتغير ‪ BYTE‬هو خانه واحدة أما المسجل‬
‫فان طوله هو خانتين ‪) .BYTE-2‬أي أن المتغيرات )المعاملت(‬
‫يجب أن تكون من نفس النوع (‬

‫يستـقبل المر‬ ‫‪ASEMBLER‬‬ ‫بيــنما نجــد الـ‬


‫بايت فإن المصدر يجب أن يكون‬ ‫‪AH‬‬ ‫‪ ) ’MOV AH, ‘A‬مادام‬
‫كذلك بايت (‬

‫‪-25-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫ويقوم أيضا بتقبل‬ ‫المسجل ‪AH‬‬ ‫في‬ ‫‪41h‬‬ ‫حيث يتم وضع الرقم‬
‫المر‬
‫كلمة فإن المصدر يجب أن يكون‬ ‫‪AX‬‬ ‫‪ ) ’MOV AX ,’A‬مادام‬
‫كذلك كلمة (‬
‫في المسجـل ‪.AX‬‬ ‫الرقــم ‪0041h‬‬ ‫حيـث سيــتم وضــع‬
‫الوامر ‪INC (Increment) , DEC (Decrement) , NEG‬‬
‫قيمه مسجل أو‬ ‫أما المرين ‪ INC ,DEC‬يتم فيها زيادة أو نقصان‬
‫موقع في الذاكرة بمقدار ‪ 1‬والصيـغة العامة لها هي‪:‬‬
‫‪INC‬‬ ‫‪Destination ; Destination = Destination +1‬‬
‫‪DEC Destination ; Destination = Destination - 1‬‬
‫يقـوم بجمع ‪ 1‬إلى محتويات المتغيـر‬ ‫فمـثل المر ‪INC WORD1‬‬
‫‪WORD1‬‬
‫يـقوم بإنقاص الرقم ‪ 1‬مـن محتويات‬ ‫بيـنما المر ‪DEC WORD2‬‬
‫المتغيـر ‪.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‬‬
‫لنه ل يمكن نقل محتويات لمتغير في الذاكرة إلي متغير آخر‬
‫في الذاكرة مباشرة ً يلزم تحويل العبارة إلي نقل قيمة المتغير‬
‫إلي مسجل ثم نقل قيمة المسجل إلي الرقم المطلوب‬
‫‪MOV AX , A‬‬ ‫انقل محتويات ‪ A‬الي المسجل ‪ AX‬قبل نقلها الى ‪B‬‬
‫‪MOV B , AX‬‬
‫يتم تحويلة إلى الوامر‬ ‫‪A= 5 - A‬‬ ‫أما المر‬
‫‪MOV AX , 5‬‬ ‫ضع ‪ 5‬في ‪AX‬‬

‫‪-26-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪SUB AX , A‬‬ ‫‪ AX‬تحتوي علي ‪A-5‬‬
‫‪MOV A , AX‬‬ ‫ضعها في ‪A‬‬
‫أو إلى الوامر‬
‫‪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‬وهذا هو الحال في اغلب البرامج التي سنتطرق‬
‫‪SMALL‬‬ ‫لها‪ .‬ويتم كتابة السطر على الصورة التالية‪MODEL.:‬‬

‫الجدول التالي يوضح أسماء موديلت الذاكرة المختلفة وتوضيح‬


‫خصائص كل منها‬

‫الوصف‬ ‫الموديل‬
‫‪MODEL‬‬

‫‪-27-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫الكود في مقطع واحد والبيانات في مقطع‬ ‫‪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‬‬
‫يحتوى هذا المقطع على الوامر والتعليمات المستخدمة داخل‬
‫البرنامج ويتم تعريفه على النحو التالي‪:‬‬

‫‪-28-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪.Code Name‬‬
‫حيث ‪ Name‬هـــو اسم المقطع‪.‬ول داعي لعطاء اسم للمقطع‬
‫في حالة النموذج ‪) Small‬لن لدينا مقطع واحد فقط ( حيث‬
‫سيقوم برنامج الـ ‪ Assembly‬بإعطاء رسالة خطأ في هذه الحالة‪.‬‬
‫داخل مقطع البرنامج يتم وضع الوامر في صورة برامج‬
‫صغيــرة )إجراءات ( ‪ Procedure‬وأبسط تعريف لهذه الجراءات‬
‫على النحو التالي‬
‫‪Name Proc‬‬
‫الوامر والتعليمات داخل الجراء ;‬
‫‪Name ENDP‬‬
‫فهما إيعازات‬ ‫‪Endp‬‬ ‫و‬ ‫حيث ‪ Name‬هو اسم الجراء‪ ،‬أما ‪Proc‬‬
‫‪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‬للكتابة في ميناء إخراج‪ .‬ويتم استخدام هذه‬
‫الوامر في بعض الحيان بالذات إذا كان المطلوب هو سرعة‬
‫التعامل مع الجهاز الخارجي وعادة ل يتم استخدام هذه الوامر‬
‫في البرامج التطبيقية لسببين الول أن عناوين الموانئ قد‬
‫تختلف من جهاز لخر مما يتطلب تعديل البرنامج في كل مرة‪,‬‬
‫والثاني انه من السهل التعامل مع الجهزة الخارجية بواسطة‬

‫‪-29-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪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‬‬
‫الشاشة‬

‫‪-30-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫في الجزء التالي ستناول بعض هذه الخدمات‬
‫الخدمة رقم ‪ :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‬‬
‫إصدار صوت‬ ‫‪(BEL (Beep‬‬ ‫‪7‬‬
‫(‬ ‫‪Back Space‬‬ ‫مسافة للخلف‬ ‫‪(BS (Back space‬‬ ‫‪8‬‬

‫‪-31-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫(‬
‫تحرك بمقدار ‪Tab‬‬ ‫‪(HT (Tab‬‬ ‫‪9‬‬
‫سطر جديد‬ ‫‪(LF (Line Feed‬‬ ‫‪A‬‬
‫بداية السطر الحالي‬ ‫‪(CR (Carriage return‬‬ ‫‪D‬‬

‫‪ASCII‬‬ ‫علي شفرة‬ ‫‪AL‬‬ ‫بعد التنفيذ يحصل المسجل‬


‫لحرف التحكم‬
‫البرنامج الول‪:‬‬
‫برنامجنا الول سيقوم بقراءة حرف من لوحة المفاتيح ثم طباعة‬
‫الحرف الذي تم إدخاله في بداية السطر التالي ثم إنهاء البرنامج‪.‬‬
‫يتكون البرنامج من الجزاء التالية‪:‬‬
‫‪ -1‬إظهار علمة الستفهام "؟" على الشاشة‬
‫‪MOV‬‬ ‫‪AH,2‬‬
‫‪MOV‬‬ ‫’?’‪DL,‬‬
‫‪INT‬‬ ‫‪21h‬‬
‫قراءة حرف من لوحة المفاتيح‬ ‫‪-2‬‬
‫‪MOV AH,1‬‬
‫‪INT‬‬ ‫‪21h‬‬
‫ذلك‬ ‫ً‬
‫مسجل آخر ‪ BL‬مثل و‬ ‫‪ -3‬حفظ الحرف الذي تم إدخاله في‬
‫لننا سنستخدم المسجل ‪ 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‬‬

‫و على ذلك يصبح البرنامج على الصورة التالية‪:‬‬

‫‪-32-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪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‬تشغيل البرنامج‪.‬‬
‫فيما يلي توضيح بالتفصيل كل خطوة من الخطوات السابقة‪-:‬‬

‫‪-33-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪ -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‬‬

‫‪Linking the program‬‬ ‫‪-3‬ربط البرنامج‬


‫الملف الذي تم إنشاؤه في الخطوة السابقة هو ملف بلغة اللة‬
‫‪ Machine Language‬ولكنه غير قابل للتنفيذ لنه ل يحتوي على‬
‫الشكل المناسب للبرامج القابلة للتنفيذ وذلك للسباب التالية‪:‬‬
‫أ‪ -‬عدم تعريف مكان تحميل الملف في الذاكرة وبالتالي‬
‫فإن عمليه العنونة داخل البرنامج ل يمكن تنفيذها‪.‬‬
‫ب‪ -‬بعض السماء والعناوين داخل البرنامج تكون غير‬
‫معرفة بالذات في حالة ربط أكثر من برنامج حيث يتم‬

‫‪-34-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫من أحد البرامج نداء برامج فرعيه أخرى مكتوب في‬
‫ملف آخر‪.‬‬

‫برنامج الربط ‪ Link Program‬يقوم بإجراء عملية الربط بين الـ‬


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

‫‪Run The Program‬‬ ‫‪ – 4‬تنفيذ البرنامج‬


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

‫‪Display String‬‬ ‫إظهار رسالة علي الشاشة‬


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

‫‪-35-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫تحتاج الخدمة رقم ‪ 9‬في نداء المقاطعة ‪ INT 21h‬إلي تجهيز‬
‫عنوان إزاحة الرسالة في المسجل ‪ DX‬ولعمل ذلك يتم تنفيذ‬
‫المر ‪(LEA ( Load Effective Address‬‬
‫‪LEA‬‬ ‫‪Destination ,‬‬
‫‪Source‬‬
‫حيث المستودع هو أحد المسجلت العامة والمصدر هو اسم‬
‫المتغير الحرفي )موقع في الذاكرة(‪ .‬يقوم المر بوضع عنوان‬
‫الزاحة للمتغير المصدر في المسجل المستودع‪ .‬فمثل ً المر‬
‫‪LEA DX, MSG‬‬
‫المسجل ‪.DX‬‬ ‫لعنوان المتغير ‪ msg‬في‬‫يقوم بوضع قيمة الزاحة‬
‫ولن هذا البرنامج يحتوي علي مقطع بيانات فإننا نحتاج إلي‬
‫تجهيز المسجل ‪ 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!$‬‬

‫‪-36-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪.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‬‬ ‫’‪? ,’$‬‬
‫مباشرة وذلك‬ ‫تعريفه بعد الرسالة ‪MSG2‬‬‫عند تعريف المتغير ‪ char‬تم‬
‫لن البرنامج سيقوم بإظهار الرسالة ‪ 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‬من الحرف )وذلك لن الفرق بين الحروف الكبيرة‬

‫‪-37-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫والصغيرة في جدول ‪ 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‬‬

‫‪-38-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫ل من المتغيرات التالية ) إذا كان ممكنًا(‬‫ط تعريف ك ٍ‬‫‪ -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‬‬
‫العبارات‬ ‫الوامر ‪ MOV, ADD , SUB ,INC , DEC , NEG‬لترجمة‬
‫‪-6‬استخدم‬
‫التالية المكتوبة بلغة راقية إلى عبارات بلغة التجميع‪:‬‬
‫‪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‬‬

‫‪-39-‬‬ ‫‪SUST‬‬
‫الفصل الثالث‪ :‬مدخل إلي لغة التجميع‬
‫___________________________________________________________‬
‫‪-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‬‬

‫‪-40-‬‬ ‫‪SUST‬‬

You might also like