لغة المعالج 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 عدد عشري float 2 طباعة عدد عشري float
أيضًا قيمة f12 هو double 3 عملية طباعة double
السجل a0 قيمته String 4 طباعة نص String
عدد صحيح في المتغير v0 5 قراءة عدد صحيح
عدد عشري float في المتغير f0 6 قراءة float
عدد double في المتغير f0 7 قراءة عدد double
a0 يحمل عنوان الذاكرة  للقيمة، أيضًا a1 يحمل حجم النص. 8 قراءة نص String
10 الخروج
قيمة a0 تكون char 11 طباعة قيمة char
قيمة char في السجل a0 12 قراءة قيمة 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 = t2 branch equal beq
t1 != t0 branch not equal bne
t2 < t3 branch less than blt
t1 <= t2 branch less equal ble
t2 > t3 branch greater than bgt
t0 >= t1 branch greater equal bge
move $rd, $rs أمر تبديل بين قيم المتغيرات من rd إلى rs move
أمر يستخدم للقفص إلى عنوان بين التعليمات 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]