关于寻找斐波纳契数的我的MIPS代码有什么问题?

时间:2017-04-08 05:06:21

标签: c assembly mips

我有一个C代码如下:

int fibonacci(int n){
    int a, b, c;
    int i;

    a = 1;
    b = 1;
    c = 2;

    if(n == 1)  return 1;
    else if(n == 2) return 1;
    else if(n == 3) return 2;

    for(i = 3; i < n; i++){
        a = b;
        b = c;
        c = a + b;
    }

    return c;
}

我像这样编译这段代码。

    addi    $sp, $sp, -32   
    sw  $t0, 28($sp)
    sw  $t1, 24($sp)
    sw  $t2, 20($sp)
    sw  $t3, 16($sp)
    li  $t0, 1
    li  $t1, 1
    li  $t2, 2
    li  $t3, 3      
    move    $t4, $a0
    beq $a0, 1, FIRSTL
    beq $a0, 1, SECONDL
    beq $a0, 2, THIRDL

FIRSTL:

    li  $v0, 1
    j   FOR

SECONDL:

    li  $v0, 1
    j   FOR
THIRDL:

    li  $v0, 2
    j   FOR
FOR:

    beq $t3, $a0, ENDL
    addi    $t1, $t1, 1
    j   FOR
    move    $s0, $s1
    move    $s1, $s2
    add $s2, $s1, $s0

ENDL:

    lw  $t1, 16($sp)
    lw  $s2, 20($sp)    
    lw  $s1, 24($sp)
    lw  $s0, 28($sp)
    addi    $sp, $sp, -32
    add     $v1, $0, $s2

它只显示了第0个斐波那契,其他的斐波那契从未发生过。 我的Mips代码出了什么问题?我很困惑。

1 个答案:

答案 0 :(得分:1)

在实际执行斐波那契计算的2x j FORmove指令之前,您有add $s2, $s1, $s0

因此,asm循环中的逻辑与此C匹配:

 do{                     // FOR:
     if (i == n) break;  //   beq
     i++;                //   add 1
 }while(true);           //   j FOR

 a = b;
 b = c;
 c = a + b;
ENDL:
 // restore some registers that you didn't need to save/restore, just clobber $t regs.
 // missing jr $ra  to actually return

将工作放入循环中。