Assembly MIPS汇编中使用逻辑移位的乘法

Assembly MIPS汇编中使用逻辑移位的乘法,assembly,mips,bit-shift,multiplication,mips32,Assembly,Mips,Bit Shift,Multiplication,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,

有人能给我指点一下如何在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"

要将一个数字乘以2,只需将其向左移动即可。 若要将其除以,请将其向右移动

示例:2=10(二进制) ->2*2=4->4=100(二进制)=SLL(2)=SLL(10)(二进制)


MIPS指令将是:SLL$s1、$s2、1

将数字左移n位乘以2n。例如
n
我不明白为什么有一个数字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
//x*=3

temp=x我可能不使用任何循环结构,但我允许使用sub,添加e.t.cNo循环。正如我在我的例子中所展示的那样,它可以通过移位、加法和减法来完成"temp=x
谢谢,那么我如何得到最终的答案呢,比如n=3n=3,但n乘以多少?不管怎样,这是一个简单的数学,你可以自己计算。我知道如何通过迭代加法来实现这一点,同时使用一个数作为计数器,我要问的是:n是否可能决定你执行的移位次数?这是打破在mips中,数字自动转换为2的幂,对不起,我真的很困惑!在我的示例中,n是一个可变乘法器乘以一个常数乘法器。移位由乘法器决定。如果你的意思是n是一个乘法器,那么移位由n中的1位决定,如
  SLL $t1, $s2, 1
  SLL $t2, $s2, 3
  ADD $s2, $t1, $t2
  SLL $t1, $s2, 4
  SUB $s1, $t1, $s2
// 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
}
# 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