2012-11-27 82 views
2

我有以下用于查找$ a0到$ a1的功能的子例程。它适用于小整数,但我希望它适用于1000^6之类的东西。我在想,如果我将$ hi中的乘法存储在hi寄存器中。如何在MIPS中乘以两个大于32位的整数?

所以我想我的主要问题是,“我如何乘以两个整数,其中一个大于32位?”

pow: 
    li $v0, 1 
pow_loop: 
    ble $a1, $zero, pow_conclude 
    mult $v0, $a0 
    mflo $v0 
    addi $a1, $a1, -1 
    j  pow_loop 
pow_conclude: 
    jr $ra 

回答

2

在阅读本杰克逊的回答后,我写了这个,并用MARS进行了检查。

pow: 
    li $v0, 1 
    li $v1, 0 
pow_loop: 
    ble $a1, $zero, pow_conclude 
    mult $v1, $a0 
    mflo $v1 
    mult $v0, $a0 
    mflo $v0 
    mfhi $t0 
    add $v1, $v1, $t0 
    addi $a1, $a1, -1 
    j  pow_loop 
pow_conclude: 
    jr $ra 
+0

从你的答案中挖出一些MIPS知识我更新了我的。 –

1

还记得你在学校纸上乘数。将输入分解为16位或32位组件,并将所有部分产品相乘,并将它们加在一起,从而实现进位链。

不知道MIPS,但基于@ russjohnson09的自我回答:

假设你在这里做32 * 64位(来自$a0$v0,v1),你将有一个96位的结果。事情是这样的:

mult $v0, $a0 
    mflo $v0 
    mfhi $v2 
    mult $v1, $a0 
    mflo $v1 
    add $v1,$v1,$v2 

96的高32位是addmfhi的第二mult后的进,但我假设你在循环,这上半部分将始终为0。换句话说,连续的32 * 64被截断为64位。