$ sx регистры гарантированно остаются неизменными при вызовах функций, поэтому вызываемый объект (функция sum) отвечает за их сохранение, только если он собирается изменить их значение.
$ tx регистров наС другой стороны, не гарантируется, что они будут неизменными при вызовах функций, поэтому ответственность вызывающего абонента (vbsme) за их сохранение.
Вы должны сохранить $ sx в стеке вызываемого.
Таккогда вы начинаете кодировать функцию суммы, вы должны сэкономить место в стеке. Если вы хотите сохранить n регистров, то сохраните n * 4.
Пространство в стеке сохраняется путем вычитания из регистра $ sp, которыйуказывает на основание стека.Перед кодом вашей функции вы должны создать стек для этой функции, сохраняя все регистры, сохраненные вызывающей стороной, регистры адресов и регистры глобального указателя, когда это необходимо
sum:
#stack frame creation. Caller registers saved,
# return address and frame pointer
subu $sp,$sp,36 #Save space in the stack for registers $s0, $s7 + $ra
sw $ra,32($sp)
sw $s0,0($sp)
sw $s1,4($sp)
#and so on. Note that also you should save the $ra register only if you are
# going to call another function
#do something with $sx
#stack frame destruction
#restore $sx and $ra registers
lw $ra,32($sp)
lw $s0,0($sp)
lw $s1,4($sp)
...
lw $s7,28($sp)
jr $ra
Кстати, по соглашению, регистры $ a0, $a3 должен хранить аргументы функции, которую вы вызываете.Также обратите внимание, что, поскольку вы используете регистры $ s0, $ s7, вам необходимо проделать дополнительную работу.Конвенция гласит, что если вы не используете их, вам не следует их сохранять, поэтому, возможно, вы могли бы вместо этого использовать регистры $ tx (временные).