因此,我在将C代码转换为mips时遇到了麻烦。任务是为递归函数编写一个mips代码,该代码将偶数加起来并返回整数。我相信我的C代码是正确的:
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
有人可以帮我弄清楚吗?我哪里做错了?
最佳答案
数组的最后一个元素是arr[len-1]
,而不是arr[len]
。
int sumRec(int arr[], int len){
if(len==0){
return 0;
}
else if(arr[len-1]%2==0){
return arr[len-1]+sumRec(arr,len-1);
}
else{
return 0+sumRec(arr,len-1);
}
}
关于c - MIPS递归出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33292124/