لغة المعالج MIPS، الدليل الكامل للغة التجميع mips على الويندوز

[ad_1]

فهرس المحتويات

لغة البرمجة mips منخفضة المستوى تدرّس في العديد من الجامعات حول العالم، فما هي لغة المعالج MIPS، ولماذا يركز عليها الأكاديميون؟


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

ما هي لغة المعالج mips؟

هو نوع من أنواع لغات البرمجة منخفضة المستوى أو الاسيمبلي وهذه اللغة تختص المعالجات من النوع MIPS، هذه المجموعة من التعليمات المخفضة تم تطويرها من قبل منظمة MIPS Technologies، وأصل الاختصار في MIPS هو Microprocessor without Interlocked Pipeline Stages.


“اقرأ أيضًا: أفضل لغات البرمجة لتصميم الويب: أفضل لغات مطوري frontend“


استخدامات لغة المعالج mips

مع أن هذه اللغة قد لا تستخدم للبرمجة بشكل مباشر، أي أنه لا يمكن عمل برمجي مشروع كبير بها، إلا أنها مفيدة جدًا لفهم الأنظمة والتعامل معها بدقة، حيث أن هناك العديد من الأنظمة في الحواسب المضمنة تعمل على معالج MIPS.

إن لغة التجميع mips تترجم التعليمات القادمة من المستخدم والتي تكون عادةً برنامج بلغة عالية المستوى مثل لغة c++ أو البايثون إلى لغة تفهمها الآلة، هذه اللغة مثبتة مسبقًا على كل المعالجات، أيضًا من المهام الشائعة التي تقوم بها لغات التجميع هي:

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

من يستخدم لغة الاسيمبلي؟

  • خبراء الهندسة العكسية.
  • مصممو الأجهزة.
  • مبرمجي المجمعات Compilers ونظم التشغيل وغيرهم.

محررات لغة mips

إن برنامج Qtspim من أفضل البرامج لكن توجد هناك الكثير من بدائل برنامج Qtspim قبل الشروع في البرمجة بلغة MIPS نقوم أولًا باختيار محرر الأكواد المناسب الخاص بلغة Mips، وهناك العديد منها:

  • محرر لغة الاسيمبلي MARS
  • محرر EduMIPS64
  • أيضًا محرر mips assembler

“اطلع أيضًا على: الدوال في لغة c++“


أساسيات البرمجة بلغة المعالج MIPS

يمكن أن نقسّم البرنامج في لغة المعالج MIPS إلى قسمين وهما data. و text. أما text فهو الذي تذكر فيه جميع الأوامر، وdata. فهي المكان الذي يمكننا فيه استخدام تعريف المتغيرات لاستخدامها في الأوامر.

أنواع البيانات

إن جميع التعليمات في MIPS هي 32 بت، حيث يمثل البايت في البيئة 8 بتات، ويتطلب كل حرف مستخدم واحد بت والعدد الصحيح أربع بتات كما في القواعد العامة لأنواع البيانات لأغلب لغات البرمجة.

الوصفنوع البيانات للمتغير
يحجز 4 بتات مثل الرقم الصحيح 2.word.
يحجز بت واحد مثل الحروف.byte.
يحجز عدد معين من البتات بشكل متتالي في الذاكرة.space.
يحفظ نص معين يوضع ما بين علامة التنصيص “”.asciiz.

السجلات

تمتلك لغة البرمجة MIPS 32 سجل مختلفة الأغراض يمكن استخدامها أثناء كتابة البرنامج وذلك بحفظ قيمة فيها أو استخدامها في عملية حسابية أو منطقية أخرى وذلك بذكر رقم السجل من 0 إلى 31 أو اسمه مثل t1 أو t3، ويجب أيضًا تضمين رمز الدولار “$” قبل اسم السجل.

تنقسم هذه السجلات إلى مجموعتين هما:

  • المجموعة الصحيحة: كما تنقسم أيضًا إلى مجموعتين هي المجموعة العامة والتي تتضمن سجلات مؤقتة تبدأ من t0-t7، وأيضًا سجلات الحفظ وتبدأ من s0 وحتى s8.
  • مجموعة الفاصلة العشرية: وهذه السجلات تبدأ من a0 وتنتهي إلى a3.

العمليات الرياضية

الوظيفةالأمر
أمر الجمع لسجلين في الذاكرة، ويكون الناتج السجل الأول مثال  add $t0 , $t1 ,$t2 إذن الناتج في t0.add
نفس الأمر السابق لكنه هنا يقوم بجمع عدد ما بشكل مباشر إلى السجل، لذا فهو يتكون من معاملين فقط.addi
مثل الأمر add لكنه هنا يطرح بدل أن يجمع.sub
هذا الأمر يتكون من معاملين يضرب به السجل الأول في السجل الثاني، والناتج يذهب إلى lo والكسور في Hi، كما يدعم الأعداد السالبة والموجبة.mult
هو الأمر السابق نفسه، لكن ما يميزه هو إمكانيه الضرب مع الأعداد السالبة فقط.multu
أمر القسمة وهو مثل الضرب، مثال: div $t0 , $t1 والناتج يحفظ في lo وباقي القسمة في hi، ويقبل السالب والموجب من الأعداد.div
تدخل الأعداد السالبة والوجبة مع هذا الأمر بدلاً من div الذي يخص الأعداد السالبة فقط.divu

ملاحظات في العمليات الحسابية:

طريقة الحصول على ناتج القسمة والضرب تقتضي بتخزين الناتج في lo إلى سجل ما، مثل:

mflo $t0

أوامر التحميل والتخزين في الذاكرة

هناك أوامر عديدة تقوم بالتحميل من الذاكرة إلى متغير محدد، مبينه في الجدول التالي:

الغرضالتعليمة أو الأمر
نسخ كلمة أو 4 بتات من مكان في الذاكرة إلى سجلlw
نسخ 2 بتات أي نصف كلمة سواءًا كانت سالبة أم موجبةlh
أيضا نسخ نصف كلمة لكن البتات تعامل وكأنها قيم سالبةlhu
تحميل او نسخ بت واحد كقيمة موجبة أو حتى سالبةlb
نسخ بت واحد ويعامل هذا البت كقيمة سالبةlbu
تحميل قيمة مباشرة (عدد صحيح) إلى سجل ماli
تحميل نصف كلمة كقيمة مباشرة إلى سجلlui
نسخ أو تحميل عنوان ذاكرة لمتغير إلى سجل محددla

أما في عملية التخزين فيحدث العكس تمامًا، حيث يقوم بتخزين قيمة من سجل ما إلى مكان محدد في الذاكرة، والأوامر تختلف بحسب نوع البيانات المستخدمة.

لتخزين كلمة word من سجل إلى الذاكرةsw
تخزين نصف كلمة أو 2 بتات من سجل إلى الذاكرةsh
تخزين بت واحد فقط إلى  مكان في الذاكرةsb

العمليات المنطقية

الأمر في لغة المعالج MIPSالأمر في لغة البرمجة السيالعملية
sll>>الإزاحة لليسار
srl<<الإزاحة لليمين
and , andi&تطبيق and لكل بت
or , ori|تطبيق or لكل  بت
nor~عملية not لكل بت
غير مدعومةغير مدعومةالعملية xor

 

عمليات الإدخال والإخراج

ربما تسألت عن سبب ذكر السطرين الأخيرين في البرنامج، فلو أنك لم تكتبها فلن يتنفذ البرنامج، ومعناها هو:

السطر الأول هو يبدأ بالأمر li وهو أمر التحميل للذاكرة يمكن أي أنه يضيف قيمة إلى سجل ما مثل الأمر addi، وهنا أضفنا القيمة 10 بالتحديد إلى السجل v0 وهذا السجل هو من يتحكم في عمليات الإدخال والإخراج في البرنامج، ويعتد هذا على القيمة التي تضاف إليه باستمرار على حسب الجدول التالي:

النتائج ومكان تخزينهاالمدخلات ومكان تخزينهاالقيمة المضافة إلى v0العملية أو الخدمة
قيمة a0 عدد صحيح1طباعة عدد صحيح int
قيمة f12 عدد عشري float2طباعة عدد عشري float
أيضًا قيمة f12 هو double3عملية طباعة double
السجل a0 قيمته String4طباعة نص String
عدد صحيح في المتغير v05قراءة عدد صحيح
عدد عشري float في المتغير f06قراءة float
عدد double في المتغير f07قراءة عدد double
a0 يحمل عنوان الذاكرة  للقيمة، أيضًا a1 يحمل حجم النص.8قراءة نص String
10الخروج
قيمة a0 تكون char11طباعة قيمة char
قيمة char في السجل a012قراءة قيمة char

مثال على الإدخال والإخراج بلغة برمجة المعالج MIPS:

data.

?”stringOne: .asciiz “What is ur name

” ” stringTwo: .asciiz

text.

la $a0 , stringTwo

li $v0 , 4

syscall

la $a0 , stringTwo

ori $a1 , $0 , 6

li $v0 , 8

syscall

la $a0 , stringTwo

li $v0 , 4

syscall

ori $2 , $0 , 10

syscall

اللوب والشروط

إن في أي لغة برمجة شروط و Loops وهي المعروفة بالأسماء for وwhile وdo while، لكن كيف يمكننا أن نطبقها على لغة برمجة المعالج mips؟ تكمن الحيلة في استخدام الشروط كما في الجدول الآتي:

صيغة للتبسيطالمعنى بالإنجليزي لتسهيل الحفظصيغة الأمر
t0 = t2branch equalbeq
t1 != t0branch not equalbne
t2 < t3branch less thanblt
t1 <= t2branch less equalble
t2 > t3branch greater thanbgt
t0 >= t1branch greater equalbge
move $rd, $rsأمر تبديل بين قيم المتغيرات من rd إلى rsmove
أمر يستخدم للقفص إلى عنوان بين التعليماتj

لكي نعرف الصيغة نأخذ مثال عليها.

beq $t0 , $t1 ,target

إذا كانا السجلان t0 و t1 يحققان الشرط، أي متساويان فإن القيمة فإنه يذهب إلى العنوان المسمى target أما إذا لم يكن كذلك فإنه سيستمر في تنفيذ الأوامر التي تأتي بعده.

يمكن تعريف عنوان وذلك بوضعه في مكان ما في البرنامج، أي ذكر اسمه فقط ثم علامة “:”، يمكن أن نعطي مثال توضيحي وهو:

addi $t1 , $0 , 10

:Loop

addi $s0 , $s0 , 1

bgt $s0 , $t0 , Exit

move $a0 , $s0

ori $v0 , $0 , 1

syscall

j Loop

:Exit

ori $v0 , $0 ,10

syscall

شرح لغة المعالج Mips اسيمبلي على برنامج Qtspim

يعد برنامج Qtspim هو أكثر البرامج شائعة الاستخدام على النطاق التعليمي، بالمقارنة مع بدائل Qtspim الأخرى، يقوم هذا البرنامج بتنفيذ برامج الاسيمبلي من النوع MIPS32 ثم عرض معلومات الذاكرة وسجلات المعالج، كما يحتوى على مصحح أخطاء صغير جدًا.

برنامج Qtspim
برنامج Qtspim

قبل البدء في استخدام برنامج Qtspim نقوم بضبط الإعدادات الرئيسية فيها وذلك من خلال النقر على Simulation ثم الخيار الأخير “Settings”، بعد ذلك ننتقل إلى الخيار على اليسار، نجد خمسة خيارات نلغي التحديد على كل الخيارات ما عدا الخيار “Accept Pseudo Instructions” كما هو مبين في الصورة التالية:

تشغيل Qtspim بشكل صحيح
تشغيل Qtspim بشكل صحيح

بعد ذلك ننشأ ملف txt ثم نكتبه فيه الكود التالي كتجربة:

addi $t0 , 20

addi $t1 , 4

li $v0 , 10

syscall

عمل ملف s. أو asm.
عمل ملف s. أو asm.

بعد الحفظ للملف نغير امتداده من txt. إلى s. أو asm. وهي صيغة برامج الاسيمبلي، حينها ستظهر لك رسالة تريد منك التأكيد على تغيير الامتداد وبعدها لا تستطيع أن تفتح الملف بأي محرر، لكن إذا لم تستطع تغيير الامتداد فيمكنك الذهاب إلى الكمبيوتر ثم على اليمين انقر على تنظيم، بعد ذلك خيارات المجلد والبحث ثم الخيار “عرض”، وإلغاء التعليم على “إخفاء ملحقات الملفات لأنواع الملفات المعروفة”.

ثم نفتح تطبيق Qtspim وننقر على ملف، ثم تحميل ملف “Load”‘، ونختار الملف الذي كتبناه، ثم ننقر على “Open” بعدها يمكن ملاحظة التغييرات التي طرأت على بالإضافة إلى بعض المعلومات الأخرى كما هو موضح في الصورة التالية:

مثال للجمع في لغة برمجة المعالج MIPS
مثال على الجمع

“اقرأ أيضًا: تطبيق شير إت SHAREit“


تحويل برنامج من لغة عالية المستوى إلى منخفضة

إن التدرب على تحويل البرامج من لغة برمجة عالية المستوى إلى لغة البرمجة mips يساعدك على الفهم عمل المترجم الذي يحاول بقدر الإمكان تقليل عدد الأوامر حتى تزيد الكفاءة في العمل، وكذلك تزداد سرعة، من الأمثلة على ذلك:

;int x y z

;x= 5

;y= 4

;z=2*(x+y)

الكود بلغة المعالج MIPS

addi $t0 , 5

addi $t1 , 4

too#

addi $t3 , 2

add $t2 , $t0 , $t1

multu $t2 , $t3

mflo $t2

li $v0 , 10

syscall

مثال على الضرب وlow
مثال على الضرب وlow

بعد هذا الكود فإن الناتج من العملية سيظهر في المتغير t2.


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

[ad_2]

اترك ردّاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *