【问题标题】:How to debug my Fibonacci generator in MIPS assembly language?如何用 MIPS 汇编语言调试我的斐波那契生成器?
【发布时间】:2025-12-13 07:30:01
【问题描述】:

我的代码应该从用户那里接受一个值 n 来输出斐波那契数列。该代码不适用于 4 及更高版本。另外,如何修复代码,使 fib 系列从 0 开始,而不是 1。如果用户输入 4,代码的输出应如下所示

0 1 1 2

这里是代码

.data
string:.asciiz "Enter N: " # space to insert between numbers
space:.asciiz " " # space to insert between numbers
.text

la $a0, string
li $v0, 4   
syscall # print the string

li $v0,5 #read inetger in $t0
syscall
move $t0,$zero
addi $t0,$v0,-1
move $t1,$zero
addi $t1,$t1,1

move $s0,$zero
addi $s0,$s0,1


move $a0,$s0
li $v0, 1 # $integer to print

syscall


la $a0, space
li $v0, 4   
syscall # print the string


loop:

move $a0,$s0
li $v0, 1 # $integer to print
syscall


la $a0, space
li $v0, 4   
syscall # print the string

addi $t0,$t0,-1
beq $t0,$zero,stop

add $s0,$s0,$t1

sub $t1,$a0,$t1

j loop

stop:
li $v0, 10 # system call for exit
syscall # Exit!

【问题讨论】:

    标签: mips


    【解决方案1】:

    您错误地实现了算法。你写的东西翻译成这样:

    int prev1 = 1, fn = 1;
    for (int n = 0; n < input; ++n) {
        printf("%d ", fn);
        fn += prev1;
        prev1 = &space - prev1;
    }
    

    但你应该做的更像是:

    int prev2 = 0, prev1 = 1;
    for (int n = 0; n < input; ++n) {
        int fn = prev1 + prev2;
        printf("%d ", prev2);
        prev2 = prev1;
        prev1 = fn;
    }
    

    关于您标题中的问题(“如何调试?”):SPIM(及其变体)和 MARS 都为您提供了很多调试功能。
    有代码、数据和寄存器查看器。
    您可以单步执行代码(通常使用 F10,但不同模拟器之间可能会有所不同),还可以在特别感兴趣的代码位置设置断点。

    【讨论】:

      最近更新 更多