البرمجة بلغة التجميع

من ويكي الهندسة المعلوماتية
اذهب إلى: تصفح، ابحث

مقدمة

يوجد ثلاث مستويات للبرمجة تكمل بعضها البعض وهي :

  • اللغات عالية المستوى كـ ( ++C# , pascal ,C )
  • البرمجة بلغة التجميع (assembly language )
  • البرمجة بلغة الآلة ( machine language .)

فعندما نبدأ بكتابة برنامج ما بلغة عالية المستوى على المترجم compiler يتم ترجممته إلى لغة أخرى وسيطة بين لغة المعالج واللغة التي كتب بها تسمى : لغة التجميع (assembly language ).

هذه اللغة تكتب على المجمع assembler الذي يقوم بدوره بتحويل البرنامج الذي كتب بلغة التجميع إلى لغة الآلة (لغة الأصفار والواحدات) ( machine language .).

ومن ثم يتم ربط هذا البرنامج الثنائي بمكتبات جاهزة ضمن المعالج .. هذه المكتبات تحوي برامج جزئية لكافة التعليمات التي يمكن للمعالج تنفيذها ( add , and , sub ) تتم عملية الربط بواسطة الرابط linker وبعد هذه المرحلة يتم الحصول على برنامج ثنائي قابل للتنفيذ من قبل المعالج ، يتم التنفيذ ومن ثم تحميل البرنامج إلى الذاكرة بواسطة ما يسمى loader .. ويكون مخطط التنفيذ كما يلي :

مخطط التنفيذ.jpg













البرمجة بلغة التجميع

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

ميزات لغة المجمع :

  1. القرب من العتاد
  2. بساطة العبارات
  3. ضرورة تجزئة العبارة الواحدة إلى عمليات بسيطة
  4. استخدام السجلات كمعاملات بدلاً من المتحولات

المشكلة :

العدد المحدود من السجلات

مثال :

MIPS يحوي 32 سجل على 32 بت

كيفية كتابة التعليمات بلغة التجميع

تقسم التعليمة إلى جزأين :

  1. الرمز الاصطلاحي Mnemonic : (اسم التعليمة التي سيتم تنفيذها).
  2. المعاملات operand : السجلات التي تتم عليها العملية .

مثال -1- :

تعليمة الجمع التالية :

In Assembly :	 add a, b, c
add b to c and put the result in a
 
In C: 		
a = b + c;

مثال -2- :

المطلوب إجراء العملية التالية :

a = b + c + d - e;

نلاحظ أنه علينا التجزئة إلى تعليمات مستقلة:

add  a, b, c    #  a = sum of b & c
add  a, a, d    #  a = sum of b,c,d
sub  a, a, e    #  a = b+c+d-e

ملاحظات :

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


التصريف Compilation

ونعني به ترجمة العبارات بلغة عالية المستوى مهما كان طولها إلى لغة التجميع مع أخذ كافة القواعد المذكورة سابقاً بعين الاعتبار .

مثال : ترجم التعليمة التالية إلى لغة المجمع :

f = (g + h) - (i + j);

الخطوة الأولى :

	Add   f, g, h	# f contains g+h

نجمع g و h ونضع الناتج في f

الخطوة الثانية :

Cannot use f !
Compiler creates temporary variable to hold sum: t1
		�add   t1, i, j	                 # t1 contains i+j

لا نستطيع استخدام f لأننا نريد وضع النتيجة النهائية فيه ..

لذلك سنضع ناتج i+j في متحول آخر نسميه t1

الخطوة الثالثة :

sub   f, f, t1          # f = (g+h)-(i+j)

وأخيراً نقوم بطرح t1 من f ونضع النتيجة النهائية في f .


بنية المعالج MIPS R3000

لتعلم البرمجة بلغة التجميع يجب أولاً معرفة بنية المعالج المراد تعلم لغة التجميع الخاصة به ، لذلك سنتعرف بشكل بسيط على معالج الـ MIPS

السجلات :

عددها 32 سجل متتالية تترقم من R0 وحتى R31 .

دوماً نضع إشارة $ قبل أي اسم لأي سجل .

بشكل عام ، نستخدم أسماء السجلات لجعل البرنامج أكثر قابلية للقراءة .

العمليات التي يقوم بها :

يقوم المعالج MIPS بعدد محدود من العمليات مثل :

  • Load/Store
  • Computational
  • Jump and Branch
  • Floating Point (coprocessor)
  • Memory Management
  • Special


أنماط العنونة

للتعليمات المختلفة أنماط محددة للتعبير عنها ، تسمى أنماط العنونة وهي :

  • العنونة بالسجل : وفيها : معاملات التعليمة فقط سجلات مثل :

Add r1, r2

  • العنونة الفورية : معاملات التعليمة هي سجلات مع قيمة عددية ثابتة مثل :

Add r1.#10h

  • العنونة المباشرة : معاملات التعليمة هي سجل ما مع عنوان لقيمة عددية وليس عدد مباشر مثل :

Add r1, 10h

  • العنونة غير المباشرة : معاملات التعليمة هنا هي سجل محدد وعنوان ما يحوي عنوان المعامل الثاني المراد أداء التعليمة عليه مثل :

Mov r1, @10h

  • العنونة النسبية : معاملات التعليمة حينها هي مقدار القفز أو الانتقال للمكان الجديد مثل :

Jmp 10h

ملاحظة : يمكن لبعض المعالجات ألا تدعم كل هذه الأنماط


مصاغات التعليمات

يمكن للتعليمات أن تأخذ الأشكال التالية :

  • مصاغة ثلاثية العناوين

Inst dst, src1, src2

حيث dst هي الوجهة وأما src1, src2 فهي المصادر

  • مصاغة ثنائية العناوين

Inst dst, src

يمكن أن تكون بأحد الشكلين :

dst <-- dst + src

or dst <-- src + A

حيث A هو المراكم الذي يتم جلب القيم منه .

  • مصاغة وحيدة العنوان

Inst src

تكون بالشكل :

A <-- A + src

حيث يتم وضع في المراكم القيمة السابقة نفسها بعد إضافة القيمة scr على سبيل المثال .

  • مصاغة بلا عنوان

inst

وهنا يتم التعامل مع الـ stack بشكل مباشر ، حيث أن المعاملات التي تتم عليها العملية inst هي نفسها القيم التي يتم جلبها من الـ stack ، فهي لا تحتاج غلى عناوين أبداً وإنما يتم الانتقال وبشكل تسلسلي من قمة المكدس وحتى آخره للحصول على القيم بواسطة مؤشر يسمى sp (stack pointer ) ولا ننسى بان الـ stack هو نفسه الـData Memory .