修正MIPS斐波那契函数代码:实现终端输入位置返回对应数值
修正后的MIPS斐波那契数计算代码
你的代码存在三个核心问题导致无法正常运行,以下是修正后的完整代码及问题说明:
问题点说明
- 参数传递缺失:主函数中读取输入值后存入
$t0,但调用Fib函数前未将该值传入函数的参数寄存器$a0,导致递归函数拿到的是无效参数。 - 返回值引用错误:
Fib函数将计算结果存在$v0寄存器,但主函数打印时错误引用了$v1,无法输出正确结果。 - 字符串笔误:输出提示文本中的"Lucas Sucession"应为"Fibonacci Sequence"(可选修正,不影响运行但符合需求描述)。
修正后的完整代码
.data ask4num: .asciiz "Enter a number: " printNum: .asciiz "\nThe number in the Fibonacci Sequence is: " .text .globl main main: # 打印输入提示 addi $v0, $zero, 4 la $a0, ask4num syscall # 读取用户输入的自然数 addi $v0, $zero, 5 syscall # 将输入值存入$t0 addi $t0, $v0, 0 # 打印结果提示文本 addi $v0, $zero, 4 la $a0, printNum syscall # 将输入值传入Fib函数的参数寄存器$a0 move $a0, $t0 jal Fib # 打印计算结果(引用正确的返回寄存器$v0) addi $v0, $zero, 1 addi $a0, $v0, 0 syscall # 退出程序 addi $v0, $zero, 10 syscall Fib: # 保存寄存器到栈中 addi $sp, $sp, -12 sw $ra, 0($sp) sw $a0, 4($sp) sw $s0, 8($sp) # 递归终止条件:n=0返回0 beq $a0, $zero, ReturnZero # 递归终止条件:n=1返回1 addiu $t0, $zero, 0 slti $t0, $a0, 2 bne $t0, $zero, ReturnOne # 计算Fib(n-1) addi $a0, $a0, -1 jal Fib move $s0, $v0 # 计算Fib(n-2) lw $a0, 4($sp) addi $a0, $a0, -2 jal Fib # Fib(n) = Fib(n-1) + Fib(n-2) add $v0, $v0, $s0 # 恢复寄存器并返回 lw $s0, 8($sp) lw $ra, 0($sp) addiu $sp, $sp, 12 jr $ra ReturnZero: lw $s0, 8($sp) lw $ra, 0($sp) addiu $sp, $sp, 12 li $v0, 0 jr $ra ReturnOne: lw $s0, 8($sp) lw $ra, 0($sp) addi $sp, $sp, 12 li $v0, 1 jr $ra
内容的提问来源于stack exchange,提问作者ronny
相关产品推荐
相关产品推荐

