MIPS中的递归函数

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

我是这个网站和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
            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

什么不起作用?