代码之家  ›  专栏  ›  技术社区  ›  rigon

MIPS中的递归

  •  5
  • rigon  · 技术社区  · 14 年前

    我想为MIPS实现一个汇编中的递归程序。更具体地说,我想实现著名的Fibonacci函数。

    以下是C语言的实现:

    int fib(int n) {
        if(n<2)
            return 1;
        return fib(n-1)+fib(n-2);
    }
    
    5 回复  |  直到 10 年前
        1
  •  9
  •   Jason Plank Maksim Kondratyuk    13 年前

    # int fact(int n)
    fact:
        subu    sp, sp, 32  # Allocate a 32-byte stack frame
        sw  ra, 20(sp)  # Save Return Address
        sw  fp, 16(sp)  # Save old frame pointer
        addiu   fp, sp, 28  # Setup new frame pointer
        sw  a0,  0(fp)  # Save argument (n) to stack
    
        lw  v0, 0(fp)   # Load n into v0
        bgtz    v0, L2      # if n > 0 jump to rest of the function
        li  v0, 1       # n==1, return 1
        j   L1      # jump to frame clean-up code
    
    L2:
        lw  v1, 0(fp)   # Load n into v1
        subu    v0, v1, 1   # Compute n-1
        move    a0, v0      # Move n-1 into first argument
        jal fact        # Recursive call
    
        lw  v1, 0(fp)   # Load n into v1
        mul v0, v0, v1  # Compute fact(n-1) * n
    
        #Result is in v0, so clean up the stack and return
    L1:
        lw  ra, 20(sp)  # Restore return address
        lw  fp, 16(sp)  # Restore frame pointer
        addiu   sp, sp, 32  # Pop stack
        jr  ra      # return
        .end    fact
    
        2
  •  4
  •   Tom    14 年前

    -加载 n-1 进入之内 $a0

    -使用 jal 呼叫指令 fib 递归地。

    -从 $v0 注册。

    -加载 n-2 a0美元

    -使用 日航 小谎 递归地。

    注册。

    addu 指令。。。

    哦,是的,你必须检查一下 if 使用分支,但这与递归无关。

    如果你需要帮助,编译器是你的朋友。

    $objdump-小错

    但是

    $gcc -S -mrnames fib.c -o fib.s
    

    会更清楚。

        3
  •  1
  •   Ofir    14 年前

    提示-考虑一堆。

    顺便说一句,递归在复杂性(时间和空间)方面是一个非常糟糕的解决方案。一个循环和两个变量会更好。

        4
  •  0
  •   integer    14 年前

    将C函数编译成一个对象文件,并查看

    objdump -d fib.o
    

    可能是你的出发点。