لغة المعالج MIPS، الدليل الكامل للغة التجميع mips على الويندوز
تكمن أهمية فهم لغات البرمجة منخفضة المستوى في أنها تسهم بشكل كبير على فهم الهاردوير ولغة البرمجة mips مشهورة، فما هي لغة المعالج MIPS؟
فهرس المحتويات
لغة البرمجة 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 نقوم بضبط الإعدادات الرئيسية فيها وذلك من خلال النقر على Simulation ثم الخيار الأخير “Settings”، بعد ذلك ننتقل إلى الخيار على اليسار، نجد خمسة خيارات نلغي التحديد على كل الخيارات ما عدا الخيار “Accept Pseudo Instructions” كما هو مبين في الصورة التالية:
بعد ذلك ننشأ ملف txt ثم نكتبه فيه الكود التالي كتجربة:
addi $t0 , 20
addi $t1 , 4
li $v0 , 10
syscall
بعد الحفظ للملف نغير امتداده من txt. إلى s. أو asm. وهي صيغة برامج الاسيمبلي، حينها ستظهر لك رسالة تريد منك التأكيد على تغيير الامتداد وبعدها لا تستطيع أن تفتح الملف بأي محرر، لكن إذا لم تستطع تغيير الامتداد فيمكنك الذهاب إلى الكمبيوتر ثم على اليمين انقر على تنظيم، بعد ذلك خيارات المجلد والبحث ثم الخيار “عرض”، وإلغاء التعليم على “إخفاء ملحقات الملفات لأنواع الملفات المعروفة”.
ثم نفتح تطبيق Qtspim وننقر على ملف، ثم تحميل ملف “Load”‘، ونختار الملف الذي كتبناه، ثم ننقر على “Open” بعدها يمكن ملاحظة التغييرات التي طرأت على بالإضافة إلى بعض المعلومات الأخرى كما هو موضح في الصورة التالية:
“اقرأ أيضًا: تطبيق شير إت 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
بعد هذا الكود فإن الناتج من العملية سيظهر في المتغير t2.
يحاول المترجم أن يقلل الأكواد في لغة التجمبع قدر الإمكان عندما يقوم بالتحويل من اللغة عالية المستوى إلى لغة الاسيمبلي.
يجب أنت تكون مسجل الدخول لتضيف تعليقاً.