如何移动乘数和被乘数,得到两者的乘积?

时间:2013-08-17 13:34:40

标签: assembly mips

你好,我对变换部分感到很困惑,我知道左移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

1 个答案:

答案 0 :(得分: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

你可以计算任意大乘法的答案。

我希望这能回答你的问题。