.data array: .word 10, 20, 30, 40, 50 # مصفوفة من الأعداد الصحيحة n: .word 5 # عدد العناصر في المصفوفة
.text .globl main
main: # تحميل عنوان المصفوفة وعدد العناصر la $a0, array # تحميل عنوان قاعدة المصفوفة في $a0 lw $a1, n # تحميل عدد العناصر في $a1
# إعداد المكدس للمعاملات
addi $sp, $sp, -8 # إنشاء مساحة على المكدس
sw $a0, 0($sp) # دفع عنوان المصفوفة إلى المكدس
sw $a1, 4($sp) # دفع عدد العناصر إلى المكدس
# استدعاء الروتين الفرعي LISTADD
jal LISTADD
# تنظيف المكدس بعد استدعاء الروتين الفرعي
addi $sp, $sp, 8
# إنهاء البرنامج
li $v0, 10 # تحميل رقم استدعاء إنهاء النظام
syscall
LISTADD: # إعداد إطار المكدس addi $sp, $sp, -8 # إنشاء مساحة لعنوان العودة والمجموع sw $ra, 4($sp) # حفظ عنوان العودة sw $zero, 0($sp) # تهيئة المجموع إلى 0
# الحصول على المعاملات من المكدس
lw $a0, 8($sp) # تحميل عنوان المصفوفة (من المكدس الأصلي)
lw $a1, 12($sp) # تحميل عدد العناصر (من المكدس الأصلي)
# تهيئة المجموع والعداد
move $t0, $zero # $t0 = المجموع
move $t1, $zero # $t1 = العداد
loop: bge $t1, $a1, end_loop # إذا كان العداد >= عدد العناصر، اخرج من الحلقة
lw $t2, 0($a0) # تحميل العنصر الحالي
add $t0, $t0, $t2 # إضافة العنصر الحالي إلى المجموع
addi $a0, $a0, 4 # الانتقال إلى العنصر التالي
addi $t1, $t1, 1 # زيادة العداد
j loop # تكرار الحلقة
end_loop: beqz $a1, set_avg # إذا لم توجد عناصر، تخطى حساب المتوسط div $t0, $a1 # قسّم المجموع على عدد العناصر mflo $t3 # نقل الناتج (المتوسط) إلى $t3 j store_results # القفز إلى تخزين النتائج
set_avg: move $t3, $zero # تعيين المتوسط إلى 0 (حالة عدم وجود عناصر)
store_results: # استعادة المكدس والعودة lw $ra, 4($sp) # استعادة عنوان العودة lw $zero, 0($sp) # استعادة المجموع (غير مستخدم بعد) addi $sp, $sp, 8 # تنظيف المكدس jr $ra # العودة إلى المتصل