القيام بالرياضيات
تحدث جميع العمليات الحسابية بين السجلات. تسمّي تعليمة حسابية الوجهة أولاً، ثم يتبعها المصدران اللذان تقرأهما: تعني dest = src1 + src2.
أضف الموضعين t0 و t1 إلى t2.
t0 وt1، دائمًا بهذا الترتيب. يدخلان بالشكل نفسه بغض النظر عن العملية الجارية: جمع، طرح، ضرب، قسمة، أو باقٍ. تدخل قيمتان، وتحدث عملية واحدة، وتخرج نتيجة واحدة إلى t2 على اليمين. يسمّي الـ t2 أولاً لأن النتيجة تحلّ هناك، وهذا يطابق قاعدة الترتيب الوحيدة التي تتبعها كل تعليمة حسابية في هذا الدرس.الجمع والطرح
يأخذ الرقمين المحفوظين في سجلين ويخزّن مجموعهما في سجل ثالث. يفعل الشيء نفسه للطرح: يحسب t0 - t1. تقرأ كلتا التعلميتين من السجلات فقط.
add t2, t0, t1 # t2 = t0 + t1sub t2, t0, t1 # t2 = t0 - t1
شيء يجب معرفته: يحمل السجل 32 بت فقط، لذا هناك سقف. إذا كانت النتيجة أكبر من أن تتسع، فلا يُرفع أي خطأ. تلتفّ القيمة بهدوء وتعود إلى أرقام منخفضة جدًا ويستمر التنفيذ. لن تصل القيم اليومية إلى هذا الحد، لكن السقف يستحق المعرفة.
لاستخدام رقم ثابت بدلاً من سجل ثانٍ، أضف الحرف i الذي يرمز إلى القيمة الفورية: يضيف الثابت 1. لا يوجد subi، لذا لطرح ثابت تضيف قيمة سالبة: .
الضرب والقسمة
يضرب سجلين. يقسمهما كأعداد صحيحة ويتجاهل الكسر، لذا 7 / 2 يعطي 3. يعطي الباقي، لذا 7 % 2 يعطي 1. لا تسبب القسمة أي انهيار أبدًا. القسمة على صفر تُرجع -1.
mul t2, t0, t1 # t2 = t0 * t1div t2, t0, t1 # t2 = t0 / t1 (عدد صحيح)rem t2, t0, t1 # t2 = t0 % t1 (الباقي)
تجميع العناصر
li t0, 7li t1, 5add t1, t0, t1 # t1 = 7 + 5 = 12mv a0, t1 # خدمة الطباعة تقرأ a0li a7, 1ecallli a7, 10ecall
يحمّل 7 في t0. يحمّل 5 في t1. يجمعهما ويكتب 12 في t1. ينسخ النتيجة إلى a0، لأن خدمة print تقرأ قيمتها دائمًا من a0. ثم يختار خدمة print-integer و يشغّلها. أخيرًا، و ينهيان البرنامج.
مكافأة: الضرب باستخدام عمليات الإزاحة
عندما يكون العامل قوة للعدد اثنين، توجد طريقة أسرع من . ينقل (الإزاحة المنطقية لليسار) بتات السجل إلى اليسار، وكل موضع تزيحه يضاعف القيمة: أزح بمقدار 1 للضرب في 2، وبمقدار 2 للضرب في 4، وبمقدار 3 للضرب في 8. تكلفة الإزاحة أقل من الضرب، لذا يستخدمها المترجمون كثيرًا.
li t0, 5 # ابدأ بـ 5# إزاحة لليسار بمقدار 3 بتات (5 * 2^3 = 5 * 8)sll a0, t0, 3 # a0 = 40li a7, 1 # طباعة عدد صحيحecallli a7, 10ecall
يضع 5 في t0. يزيح بتاته ثلاثة مواضع إلى اليسار. كل موضع يضاعف القيمة، لذا تتضاعف 5 ثلاث مرات (5، 10، 20، 40)، مما يعطي 40 في a0. والباقي يتبع نمط print السابق. جرّب تغيير 3 إلى 1 أو 2 وتوقّع النتيجة قبل تشغيله.
5 تم تحريكه لليسار 0 بت يبقى 5.
