MIPS:将两个32位数相乘,得到64位

时间:2015-04-09 19:50:59

标签: assembly mips

我试图在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

1 个答案:

答案 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