Я только что закончил свой класс сборки MIPs, и у меня есть для вас предложение: Не используйте PC Spim!
Я использовал PC Spim, Mars и Qemu, и лучшим для общей курсовой работы является Mars (Mips Assembler и Runtime Simulator) . Редактор хорош, он падает на намного * на 1008 * меньше и позволяет легко отлаживать и устанавливать точки останова. Он бесплатный, с открытым исходным кодом и создан государственным университетом штата Миссури.
Он поставляется в виде файла .jar, поэтому вы можете запускать его как в Windows, так и в Linux.
[ Mars Mips Emulator ]
В общем случае, простой способ определить, является ли число четным или нечетным, - это AND (поразрядно) 1 с номером, а если результат равен 0, то число является четным.
Однако, поскольку нам нужны все четные числа в серии, мы можем просто зациклить и увеличить наше число на 2, как вы делали в опубликованном коде.
При добавлении немедленного значения вы должны использовать инструкции «addi» или «addu», а не «add». Вы также сказали, что хотите поместить результат в регистр $ r12, но это недопустимый регистр MIP. Проверьте ссылку MIPs на Википедию, чтобы увидеть список всех регистров: MIPS - Использование регистра.
Я изменил вашу программу для правильной работы. Он сохраняет окончательный результат в $ t1 и затем печатает окончательный результат.
.text
.globl main
main:
li $t0, 0 # $t0 = loop counter
li $t1, 0 # $t1 = sum of even numbers
loop:
addi $t0, $t0, 2 # generating even numbers in register $t0
add $t1, $t1, $t0 # compute the sum
bne $t0, 100, loop # if t0 reached 100 then go to loop.
li $v0, 4
la $a0, result
syscall # print out "Sum = "
li $v0, 1
move $a0, $t1
syscall # print out actual sum
exit:
li $v0, 10 # terminate program run and
syscall # Exit
.data
result: .asciiz "Sum = "
После запуска этого на Марсе я получаю следующее:
Сумма = 2550
- программа закончила работу -