有人可以指点我如何制作一个使用mips程序集中的移位倍增的代码,我不明白如何使用数字2 ^ n可以帮助我乘以一个奇数被乘数
〜感谢
我目前有这个代码,我正在尝试制作一个计算器
.text
li $v0, 4
la $a0, ask_1
syscall
li $v0,5
syscall
move $s1, $v0
li $v0, 4
la $a0, ask_2
syscall
li $v0,5
syscall
move $s2, $v0
#sll $s2, $s2, 3 #$s2 * $s2^3 = result
srl $s2, $s2, 1
li $v0, 1
la $a0, ($s2)
syscall
.data
ask_1: .asciiz "Enter Multiplier\n"
ask_2: .asciiz "Enter Multiplicand\n"
result: .asciiz "The Answer is:\n"
答案 0 :(得分:4)
向左移位数n位将数字乘以2 n 。例如n << 3 = n*2^3 = n*8
。相应的指令是
SLL $s1, $s2, 1
要乘以任何数字,您可以将数字拆分为2的幂之和。例如:
n * 10 = n * 8 + n * 2 = n <&lt; 3 + n&lt;&lt; 1
SLL $t1, $s2, 1
SLL $t2, $s2, 3
ADD $s2, $t1, $t2
如果速度更快,你也可以使用减法
n * 15 = n * 16 - n = n&lt;&lt; 4 - n
SLL $t1, $s2, 4
SUB $s1, $t1, $s2
答案 1 :(得分:2)
我不明白如何使用数字2 ^ n可以帮助我乘以奇数被乘数
以下是其中一个因素不变的一些例子:
// x *= 3
temp = x << 1 // x*2
x = temp + x // x*2 + x
// x *= 10
temp = x << 1 // x*2
x = temp << 2 // x*8
x = temp + x // x*2 + x*8
// x *= 15
temp = x << 4 // x*16
x = temp - x // x*16 - x
编辑:由于您现在已经解释过多重和被乘数都是可变的(我在原始问题中感觉不清楚),我正在用解释更新我的答案如何进行乘法运算:
算法的工作原理如下:
result = 0
shift = 0
foreach (bit in multiplicand) {
if (bit == 1) {
result += multiplier << shift
}
shift += 1
}
MIPS程序集实现可能如下所示:
# In: $s1 = multiplier, $s2 = multiplicand
# Out: $t0 = result
move $t0,$zero # result
mult_loop:
andi $t2,$s2,1
beq $t2,$zero,bit_clear
addu $t0,$t0,$s1 # if (multiplicand & 1) result += multiplier << shift
bit_clear:
sll $s1,$s1,1 # multiplier <<= 1
srl $s2,$s2,1 # multiplicand >>= 1
bne $s2,$zero,mult_loop
请注意,我使用循环来简化操作。但是你可以根据需要展开循环(即复制循环体)
答案 2 :(得分:0)
将数字乘以2,只需将其向左移动即可。 要将其除以,将其向右移动。
示例:2 = 10(二进制) - &GT; 2 * 2 = 4 - &gt; 4 = 100(二进制)= SLL(2)= SLL(10)(二进制)
MIPS指令是:SLL $ s1,$ s2,1