我有以下子程序,用于查找$ a0到$ a1的幂。它适用于小整数,但我希望它适用于1000 ^ 6之类的东西。我想如果我在$ v1中存储乘法的hi寄存器。
所以我想我的主要问题是,“如何将一个大于32位的两个整数相乘?”
pow:
li $v0, 1
pow_loop:
ble $a1, $zero, pow_conclude
mult $v0, $a0
mflo $v0
addi $a1, $a1, -1
j pow_loop
pow_conclude:
jr $ra
答案 0 :(得分:2)
在阅读了本杰克逊的回答之后,我写了这个并用MARS检查了它。
pow:
li $v0, 1
li $v1, 0
pow_loop:
ble $a1, $zero, pow_conclude
mult $v1, $a0
mflo $v1
mult $v0, $a0
mflo $v0
mfhi $t0
add $v1, $v1, $t0
addi $a1, $a1, -1
j pow_loop
pow_conclude:
jr $ra
答案 1 :(得分:1)
记住你在学校如何将数字相乘。将您的输入分解为16位或32位组件,并将所有部分产品相乘并将它们加在一起,从而注意进位链。
不知道MIPS,但基于@ russjohnson09的自我回答:
假设您在此处执行32 * 64位(来自$a0
和$v0,v1
),您将获得96位结果。像这样:
mult $v0, $a0
mflo $v0
mfhi $v2
mult $v1, $a0
mflo $v1
add $v1,$v1,$v2
96的高32位是第add
之后的mfhi
加mult
的进位,但我假设你处于循环中,这个上半部分将是永远为0.换句话说,连续32 * 64截断为64位。