你好,我对变换部分感到很困惑,我知道左移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
答案 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
你可以计算任意大乘法的答案。
我希望这能回答你的问题。