2012-11-27 153 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位。