如何用MIPS汇编语言调试我的Fibonacci生成器?

时间:2017-10-26 10:28:24

标签: mips

我的代码应接受来自用户的值n以输出Fibonacci系列。该代码不适用于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!

1 个答案:

答案 0 :(得分:0)

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

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,但可能在不同的模拟器之间有所不同),还可以在特别感兴趣的代码位置设置断点。