mips 中的斐波那契数列并将结果存储在 2 个寄存器中

fibonacci sequence in mips and storing result in 2 registers

我用 mips 编写了一个 Fibonacci 程序,它将达到的最大 Int 是 1836311903,因为它存储在 $t3 寄存器中。

我读到它可以超越我使用 2 个寄存器来存储 fib 值。

下面是我的代码查找 fib 序列的方式,它的最大项是 44。

    .data 
fib:.word
    .text
    .globl  main
main:

    # The loop
        li      $t2, 1                  # Initialize f_old to 1
        li      $t1, 0                  # Initialize f_older to 0
        li      $t4, 2                  # Initialize counter i to 2
        li  $t0 ,0          #This is the n in fib(n)
        la  $s0,fib
        li  $t9 , 44   #this is the max value of n that can be stored in 32bit , anything greater causes overflow.
lp_tst: blt    $t9, $t0, done          # If $t4 > $t0 (i >  n), 
                                        #    branch out of loop.
                                        #    Otherwise continue.
        add     $t3, $t2, $t1           # Add f_old to f_older
        move    $t1, $t2                # Replace f_older with f_old
        move    $t2, $t3                # Replace f_old with f_new

    sw  $t2 , 0($s0)

        addi    $t4, $t4, 1             # Increment i (i++)
        addi    $t0,$t0,1
        j       lp_tst                  # Go to the loop test

        # Done with the loop, print result
done:   li      $v0, 1                  # Code to print an int
        move    $a0, $t2                # Put f_old in $a0
        syscall                         # Print the string


        li      $v0, 10
        syscall

关于如何将值存储在多个寄存器中以允许它存储 64 位整数的任何想法?

谢谢

假设64位的f_old$t2:$t1中,f_older$t4:$t3中:

addu  $t5, $t1, $t3    # f_new.lo = f_old.lo + f_older.lo 
sltu  $t0, $t5, $t1    # set "carry" in $t0 if f_new.lo < f_old.lo  
addu  $t0, $t0, $t4    # f_older.hi + carry
addu  $t6, $t0, $t2    # f_new.hi = f_old.hi + f_older.hi + carry

现在 64 位 f_new$t6:$t5

如果使用32位无符号整数,则可以计算出fib(47)。您可以消除某些寄存器的使用并使用类似下面的代码缩短代码。我没有检查代码,因为我没有 mips 板或 mips 模拟器,而且我不知道你使用的是哪个版本。

        li      $t9,47          #max value for n
#fibonacci code                 #i = 0 (for comments only, not in code)
        li      $t1,0           #if n odd, t1 = 0 = fib( 0)
        andi    $t0,$t9,1       #          t0 = 1 = fib(-1)
        bgtz    $t0,fib1        #br if n odd
        li      $t1,1           #if n even, t0 = 0, t1 = 1
        j       fib2            #br to check for n == 0
fib0:   add     $t1,$t1,$t0     #i++, fib(i-2) += fib(i-1), t1 = fib(i)
fib1:   add     $t0,$t0,$t1     #i++, fib(i-2) += fib(i-1), t0 = fib(i)
fib2:   subi    $t9,$t9,2       #loop if not done
        bgez    $t9,fib0
                                #result in t0