我正在对整数数组创建Quicksort算法。我正在使用此C算法并将其转换为MIPS。但是,MIPS和递归确实非常困难。
我不确定如何将参数发送到递归调用QS中。我最近发现,可以通过将堆栈指针移动4个字节来更改调用堆栈中每个帧的$ s寄存器。这将使我能够为每个堆栈帧更改$ s寄存器,从而使每个QS帧不需要一百万个变量。
我的问题是我不太了解递归过程中如何以及何时设置和获取这些$ sx值。
答案 0 :(得分:1)
通过移动堆栈指针寄存器($ sp)来实现递归。
首先,让我们了解移动堆栈指针的要点: 当您以高级语言使用递归时,基本上它的作用是将当前函数调用的状态“保存”在“堆栈存储器”中。 为此,您将必须:
但是除此之外,我们还必须保存$ ra的值,以跟踪上层函数结束时应该去的地方。
这是一个递归计算阶乘(n)的程序的简单示例:
.text
main:
# Calls Fact with Input ($a0) N = 10
li $a0, 10
jal fact
# prints the Output ($v0) Factorial(N)
move $a0, $v0
li $v0, 1
syscall
# exit
li $v0, 10
syscall
# Input: $a0 - N
# Output: $v0 - Factorial(N)
fact:
# Fact(0) = 1
beq $a0, 0, r_one
# Fact(N) = N * Fact(N-1) use recursion
# allocate 8 bytes in the stack for storing N, and $ra
addi $sp, $sp, -8
# stores N in the first, and $ra in the last position
sw $a0, 4($sp)
sw $ra, 0($sp)
# call Fact(N-1)
addi $a0, $a0, -1
jal fact
# Restore the values of N and $ra
lw $a0, 4($sp)
lw $ra, 0($sp)
# Free the 8 bytes used
addi $sp, $sp, 8
# Set the return value to be N * Fact(N-1) and return
mul $v0, $a0, $v0
jr $ra
# return 1;
r_one:
li $v0, 1
jr $ra
基本上,这是实现代码时应牢记的。 请注意:
编辑:
一些注意事项: