MIPS中的递归函数
我是这个网站和mips的新手。我试图计算一个没有它的数字的平方和,例如,f(4)=9+4+1=14。这是我代码的一部分,递归函数MIPS中的递归函数,mips,Mips,我是这个网站和mips的新手。我试图计算一个没有它的数字的平方和,例如,f(4)=9+4+1=14。这是我代码的一部分,递归函数 RecursiveFunction: subu $sp, $sp, 8 sw $ra, ($sp) sw $s0, 4($sp) li $v0, 1 beq $a0, 0, Done move $s0 $a0
RecursiveFunction:
subu $sp, $sp, 8
sw $ra, ($sp)
sw $s0, 4($sp)
li $v0, 1
beq $a0, 0, Done
move $s0 $a0
sub $a0, $a0, 1
jal RecursiveFunction
move $t0, $v0
sub $t0, $t0, 1
mul $v0, $t0, $t0
add $v0, $s0, $v0
Done:
lw $ra, ($sp)
lw $s0, 4($sp)
addu $sp, $sp, 8
jr $ra
你们能帮我吗?我花了3天时间试图解决它。在尝试将其转换为MIPS之前,使用高级伪代码总是有帮助的 在本例中,您要查找的伪代码是-
RecursiveFunction(n): // return 1*1 + 2*2 + .. + n*n
if n == 0 return 0
else return n*n + RecursiveFunction(n-1)
要计算递归函数(4),只需调用递归函数(3)。任务仍然是将其转换为MIPS。关键思想是使用MIPS堆栈($sp)来“记住”返回地址($ra)和本例中的“临时”值(n*n)。以下是MIPS代码,注释描述了每行的功能:
.text
li $a0, 3
jal RecursiveFunction # compute RecursiveFunction(3)
move $a0, $v0
li $v0, 1
syscall # and print the result
exit:
li $v0, 10
syscall
# input : $a0 = n
# output: $v0 = 1*1 + 2*2 + .. + n*n
RecursiveFunction:
addi $sp, $sp, -4 # create space on stack
sw $ra, 0($sp) # and remember the return address ($ra)
beqz $a0, return0 # if n == 0 goto return0
mul $s0, $a0, $a0 # else, $s0 = n*n
addi $sp, $sp, -4 # create space on stack
sw $s0, 0($sp) # and save n*n on it
addi $a0, $a0, -1
jal RecursiveFunction # compute $v0 = RecursiveFunction(n-1)
lw $s0, 0($sp) # $s0 = restore n*n from stack
addi $sp, $sp, 4 # and reset the stack
add $v0, $v0, $s0 # $v0 += n*n (it earlier had RecursiveFunction(n-1))
j exitFn # and jump to exitFn
return0: # base case (n = 0)
move $v0, $zero # $v0 = 0 (the return value)
j exitFn # and jump to exitFn
exitFn:
lw $ra, 0($sp) # at exit, restore the return address in $ra
addi $sp, $sp, 4 # restore stack
jr $ra # and jump to caller
什么不起作用?