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
我用 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