1. ホーム
  2. assembly

[解決済み] MIPSアセンブリの論理シフトを使用した2の累乗の乗算

2022-03-09 12:27:32

質問

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"

解決方法は?

数値をnビット左にシフトする を2倍する n . 例えば n << 3 = n*2³ = n*8 . 対応する命令は

SLL $s1, $s2, 1

任意の数を掛けるには、その数を2の累乗の和に分割することができます。たとえば

  • n*10 = n*8 + n*2 = (n << 3) + (n << 1)

      SLL $t1, $s2, 1
      SLL $t2, $s2, 3
      ADD $s2, $t1, $t2
    
    

より高速な場合は、引き算を使用することもできます

  • n*15 = n*16 - n = (n << 4) - n

      SLL $t1, $s2, 4
      SUB $s1, $t1, $s2