1

こんにちは、私はシフト部分について本当に混乱しています.Nだけ左シフトすると2 ^ Nの値になることを理解していますが、乗数を左にシフトし、被乗数を右にシフトして、2つの積を取得する方法は??

コンソールから入力された 2 つの数値の積を計算するコードを次に示します。

.data

string1: .asciiz "Enter multiplier : "
string2: .asciiz "\nEnter multiplicand : "

.text

li $s0, -1

la $a0, string1
li $v0, 4
syscall

li $v0, 5
syscall

move $a0, $v0
bltzal $a0, Negate
move $t0, $v0

la $a0, string2
li $v0, 4
syscall

li $v0, 5
syscall

move $a0, $v0
bltzal $a0, Negate
move $t1, $v0



li $t2, 1
li $t3, 0

loop:

andi $t5, $t1, 1

bnez $t5, addPartial

shift:
sll $t0,$t0,1
srl $t1,$t1,1
bgtz $t1, loop


done:

beqz $s0, negative_answer
bgtz $s0, positive_answer
bltz $s0, positive_values

Negate:

addiu $s0, $s0, 1
negu $v0, $a0
jr $ra

addPartial:
addu $t3, $t3, $t0
j shift

positive_answer:
move $a0, $t3
li $v0, 1
syscall

li $v0, 10
syscall

negative_answer:

negu $t3, $t3
move $a0, $t3
li $v0, 1
syscall

li $v0, 10
syscall


positive_values:
move $a0, $t3
li $v0, 1
syscall

li $v0, 10
syscall
4

1 に答える 1

1

私は MIPS 命令セットに精通していません。また、称賛の欠如により、私の答えはそれが可能な限り重要ではないかもしれませんが、とにかくここに行きます.

7 と 11、または 0111b と 1011b を掛けたいとしましょう。これは次のように書き直すことができます。

1*1011 + 10*1011 + 100*1011 + 0000*1011 = 1*1011 + 1*10110 + 1*1011000 + 0*10110000

だからもし

shift right the multiplicand
collect the bit pushed off
add the multiplier to the answer if this bit is 1
shift left the multiplier
repeat until finished

また

check LO bit of multiplicand
add the multiplier to the answer if this bit is 1
shift left the multiplier
shift right the multiplicand
repeat until finished

任意の大きな掛け算の答えを計算できます。

これがあなたの質問に答えることを願っています。

于 2013-08-17T15:58:16.277 に答える