使用Mips程序集中的逻辑移位进行乘法运算

时间:2013-09-15 12:22:40

标签: assembly mips mips32

有人可以指点我如何制作一个使用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"

3 个答案:

答案 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