我在MIPS中工作,并使用超过65535的数字,而且我的范围错误。我如何在此代码中解决这个问题?
## p2.asm
##
## Andrew Levenson, 2010
## Problem 2 from Project Euler
## In MIPS Assembly, for SPIM
##
## Calculate the sum, s of all
## even valued terms in the
## Fibonacci sequence which
## do not exceed 4,000,000
.text
.globl main
main:
## Registers
ori $t0, $0, 0x0 # $t0 will contain scratch
ori $t1, $0, 0x1 # $t1 will contain initial fib(N-1)
ori $t2, $0, 0x2 # $t2 will contain initial fib(N)
ori $t3, $0, 0x0 # $t3 will be our loop incrementor
ori $t4, $0, 0x0 # $t4 will be our sum
ori $t5, $0, 0x2 # $t5 contains two to test if even
ori $t8, $0, 4000000 # $t8 contains N limit
even_test:
## Test to see if a given number is even
div $t1, $t5 # $t1 / 2
mflo $t6 # $t6 = floor($t1 / 2)
mfhi $t7 # $t7 = $t1 mod 2
bne $t7, $0, inc # if $t7 != 0 then bypass sum
sll $0, $0, $0 # no op
sum:
## Add a given value to the sum
addu $t4, $t4, $t2 # sum = sum + fib(N)
inc:
## Increment fib's via xor swap magic
xor $t1, $t1, $t2 # xor swap magic
xor $t2, $t1, $t2 # xor swap magic
xor $t1, $t1, $t2 # xor swap magic
## Now $t1 = $t2 and $t2 = $t1
## Increment $t2 to next fib
addu $t2, $t1, $t2
## Is $t2 < 4,000,000?
## If so, go to loop
sltu $8, $t2, $t8 # If $t2 < 4,000,000
# then $8 = 1
bne $8, $0, even_test # if $8 == $0 then jump to even_test
sll $0, $0, $0 # no op
print:
li $v0, 0x1 # system call #1 - print int
move $a0, $t4
syscall # execute
li $v0, 0xA # system call #10 - exit
syscall
## End of Program
我该如何解决这个问题?
答案 0 :(得分:4)
(我昨天之前不知道MIPS组装,但我会试一试)
LUI用0x3D,然后是ORI用0x900(4,000,000是0x3D0900)?
答案 1 :(得分:2)
我猜这是问题所在?
ori $t8, $0, 4000000 # $t8 contains N limit
MIPS指令只有16位常量字段,因此需要使用更复杂的序列构造大于65535的常量,否则从内存加载它们。这样的事情应该有效:
ori $t8, $0, 0x3d09 # 4 000 000 >> 8
sll $t8, $t8, 8
我认为“sll dest,src,count”是你在MIPS汇编中左转的方式,但我可能错了。您还可以使用“li”宏指令,该指令采用任何32位常量,并以某种方式将其转换为寄存器,必要时使用多个指令。
答案 2 :(得分:0)
我的第一个想法是使用两个寄存器,一个用于高位,一个用于低位。你必须一起跟踪它们,但这正是我想到的。