如何在PC-Spim(MIPS汇编语言)中将大数(64位)除以2

时间:2014-12-12 21:51:06

标签: 64-bit mips divide

我有一个学校作业,用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

a program result

我可以做些什么来将大号分成两个?

1 个答案:

答案 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总是正数,所以无论如何都不需要算术运算。将其用作无符号类型