1

您好,我对移位部分真的很困惑,我知道左移 N 会产生 2^N 的值,但是如何将乘数左移和被乘数右移,得到两者的乘积?

这是计算从控制台输入的两个数字的乘积的代码:

.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 回答