Spim ожидает, что пользовательский код запускается с метки main, поэтому без него при запуске кода будет происходить ошибка.
Так что вам нужно изменить _start на main в метке и .global.
Выход goto beq $ a3, $ zero используется в двух местах недопустимо, так как команда beq ожидает запятую после $ zeroo и метку для перехода, а не 'goto label'
У вас также есть несколько операторов syscall, но вы не устанавливаете значение v0 - вы предполагаете, что оно все еще то же самое, или забыли это сделать? Также в некоторых местах кажется, что вы видите v1, когда вы, вероятно, хотели установить v0 для системного вызова.
Например:
la $a0, str1 # loads str1 address to $a0
li $v0, 4 # loads $v0 with the contents of $a0 to print it
syscall # prints str1
Устанавливает v0 в 4, готовясь к системе печати строк, которая ожидает, что строка будет печатать в a0 (которую вы настроили)
Следующие строки:
li $v0, 5 # reads the first user inserted integer from the console and
# stores it to $v0
add $a1, $v0, $zero # stores the first integer from $v0 to $a1
syscall # executes the previous commands
Установка v0 на 5 готовится к системному вызову чтения - не уверен, что должен делать add a1, v0, но после системного вызова, v0 будет хранить значение чтения. что сейчас нужно где-то хранить.
Следующие строки:
la $a0, str2 # loads str2 address to $a0
li $v1, 4 # loads $v1 with the contents of $a0 to print it
syscall # prints str2
Вы хотите напечатать str2 аналогично тому, как вы печатали atr1, поэтому a0 устанавливается на адрес str2 (что и сделала игрушка), v0 должно быть 4 (не v1)
В коде встречаются повторные случаи, а также места, где вы выполняете системный вызов, вообще не устанавливая v0.