我试图在MIPS中乘以两个32位数字。我这里有一些使用mult操作的代码。我使用mfhi和mflo操作从mult获取两个部分,但我不确定如何正确地将它们放在一起。我让他们分别打印出操作,例如。
我一直使用的输入数字是: 1143330295和999999223
我从这个程序得到的输出(显然需要一些工作)是: 266202121 -1483441327
正确的输出是1143329406632360785,或者我可以用二进制来做,如果这样会更容易。
这段代码来自我正在研究的一个更大的项目,它必须使用移位和添加算法将两个32位数相乘,而不使用mult函数。我只是试图首先代表64位数字。感谢您的任何建议/意见。
.data
getA: .asciiz "Please enter the first number(multiplicand): "
getB: .asciiz "Please enter the second number(multiplier): "
space: .asciiz " "
promptStart: .asciiz "This program multiplies two numbers. "
mipMult: .asciiz "The product, using MIPs mult is: "
endLine: .asciiz "\n"
.text
main:
li $v0,4
la $a0,promptStart
syscall
li $v0,4
la $a0,endLine
syscall
#prompt for multiplicand
li $v0,4
la $a0,getA
syscall
#acquire multiplicand
li $v0,5
syscall
move $s0,$v0
move $s5,$s0
#prompt for multiplier
li $v0,4
la $a0,getB
syscall
#acquire multiplier
li $v0,5
syscall
move $s1,$v0
move $s6,$s1 # copy
mult $s5, $s6
mfhi $t0
mflo $t1
li $v0,4
la $a0,mipMult
syscall
# print out the result (This is obviously not correct, I need some help)
li $v0,1
move $a0,$t0
syscall
li $v0,4
la $a0,space
syscall
# print out the result
li $v0,1
move $a0,$t1
syscall
# print the line feed
li $v0,4
la $a0,endLine
syscall
li $v0,10
syscall # exit program
答案 0 :(得分:2)
我猜您正在处理无符号整数,因此您应该使用multu
代替mult
。
要以十进制打印64位数字,我认为您可以实现一个算法,该算法采用64位数的模数10,将其存储在内存中的某个位置,并使用商重复直到商为零。然后以相反的顺序遍历该字符串以逐位打印数字。
在你的问题中,你说可以用二进制打印数字。这样更容易,因为您可以为两个寄存器从左到右打印每个位的值(先按顺序排列,然后按低顺序排列)。
为此,除了使用multu
代替mult
更改通话
# print out the result (This is obviously not correct, I need some help)
li $v0,1
move $a0,$t0
syscall
li $v0,4
la $a0,space
syscall
# print out the result
li $v0,1
move $a0,$t1
syscall
与
move $t2, $t0
jal print_binary
move $t2, $t1
jal print_binary
并添加此子例程:
# $t2 should hold the number to print in binary
print_binary:
li $t3, 32
li $v0, 1
print_bit:
subiu $t3, $t3, 1
srlv $a0, $t2, $t3
andi $a0, $a0, 1
syscall
bgtz $t3, print_bit
jr $ra