我有一个学校作业,用MIPS汇编语言找出1 + 2 + .. n的总和(使用PC-Spim作为虚拟机)。我写了一个简单的程序,它不处理大数字(所以n *(n + 1)不能大于2 ^ 32-1才能工作)。我今天听说教授,如果你没有使用注册表hi和lo,会告诉你使用它们并让程序也适用于64位数字!
所以这是最初的计划:
.data
n:.word 10
s:.word 0
.text
main:
lw $t0,n
add $t1,$t0,1
mulou $t1, $t0, $t1
sra $t1,$t1,1
sw $t1,s
sfarsit:
li $v0,10
syscall
这是我尝试修改它:
.data
n:.word 1048576
s:.word 0
s2:.word 0
.text
main:
lw $t0,n
add $t1,$t0,1
mult $t0, $t1
mflo $t0
mfhi $t1
sra $t0,$t0,1
sra $t1,$t1,1
sw $t0,s
sw $t1,s
sfarsit:
li $v0,10
syscall
" sra"如果将结果应用于结果的每个32位部分,则技巧不起作用。 (尽管我希望它会哈哈)
n:1048576
预期结果:549756338176
该计划给你的是什么:549755813888
我可以做些什么来将大号分成两个?
答案 0 :(得分:2)
您将2个32位数字分别除以2,而不是将1个64位数字除以2。
mult $t0, $t1
mflo $t0
mfhi $t1
sra $t0,$t0,1
sra $t1,$t1,1
sw $t0,s
sw $t1,s
您需要移动整个64位值。这意味着较高部分的移出位必须移入低部分
sra $t1, $t1, 1
srl $t0, $t0, 1
sll $t2, $t1, 31
or $t0, $t2, $t0
由于n总是正数,所以无论如何都不需要算术运算。将其用作无符号类型