Итак, у меня возникли проблемы с переводом кода на C на mips. Задача состоит в том, чтобы написать код mips для рекурсивной функции, которая суммирует четные числа и возвращает целое число. Я считаю, что мой C код правильный:MIPS рекурсия прошла неправильно
int sumRec(int arr[], int len){
if(len==0){
return 0;
}
else if(arr[len]%2==0){
return arr[len]+sumRec(arr,len-1);
}
else{
return 0+sumRec(arr,len-1);
}
}
Но, когда речь идет о переводе его в MIPS, у меня большие трудности. Я думаю, что логически это хорошо написано, но я не могу понять, почему у меня так много ошибок на моем выходе (исключения из 4 и 7 типов). Это мой код:
.data
test: .word 1, 2, 3, 4, 5
length: .word 5
x: .word 0
y: .word 2
summ: .asciiz "summ: "
nl: .asciiz "\n"
.text
main:
#prints "summ: "
li $v0, 4
la $a0, summ
syscall
#calling sumRec
la $a0, test
la $t0, length
lw $a1, 0($t0)
jal sumRec
#print output
move $a0, $v0
li $v0, 1
syscall
#exit
li $v0, 10
syscall
sumRec:
addi $sp, $sp, -12
addi $t1, $t0, -1 #compute len-1
lw $t6, y
sw $t1, 0($sp) #save len-1 in stack
sw $ra, 4($sp) #save return address
bne $t1, $zero, else_01
li $v0, 0 #set return to 0
addi $sp, $sp, 12
jr $ra
else_01:
li $t7, 4 #t7 = 4
mult $t1, $t7 #len-1 * 4
mflo $t2
add $t2, $t2, $a1
lw $t3, 0($t2)
div $t2, $t6
mfhi $t4
beq $t4, $zero, else_02
sw $t3, 8($sp)
move $a1, $t0
jal sumaRec
lw $t3, 8($sp)
add $v0, $v0, $t3
lw $ra, 4($sp)
addi $sp, $sp, 12
jr $ra
else_02:
move $a1, $t1
jal sumaRec
lw $ra, 4($sp)
addi $sp, $sp, 12
jr $ra
Может кто-нибудь, пожалуйста, помогите мне разобраться? Где я неправ?
Это странно, но они работают так же, как и ваша, и моя версия. Как вы думаете, из-за этого у меня проблема с моим MIPS? –
@NemanjaZoric. Тогда возникает проблема с вашим кодом MIPS. Подобное поведение на самом деле ожидается с учетом ваших входов, потому что 'arr [5]' заканчивается тем, что указывает на метку length:. Это заставляет вас суммировать по массиву '{2,3,4,5,5}' вместо '{1,2,3,4,5}', но нет никакого эффекта, потому что дополнительные '5' и проигнорированные' 1 не вносят вклад в сумму. Если вы измените свой «1» на «2» или уменьшите размер массива (делая длину четным «4»), вы получите другое поведение. – MooseBoys