我一直在研究一個程序在不使用MIPS mult(multu)或div(divu)命令的情況下對兩個32位無符號整數進行乘法運算。 我希望輸出看起來像multu函數一樣,作爲64位高位字/低位字組合。 我一直在使用一個模型,其中乘數是產品的右側像這樣:MIPS 32位無符號乘法,不使用多或div
for (i=0; i<32; i++)
{
if LSB(multiplier)==1
{
LH product += multiplicand;
}
right shift product-multiplier 1;
}
目前在我的代碼,我不能確定如果我從32採取可能的輸出位的護理正確添加位。
無論我選擇什麼樣的整數值,我都會得到「0 0」的輸出。
在我的代碼中,我打電話給最右邊的LSB(低位字),最左邊的是MSB(高位字)。
我的代碼:
.data
promptStart: .asciiz "This prrogram does AxB without using mult or div"
getA: .asciiz "Please enter the first number(multiplicand): "
getB: .asciiz "Please enter the second number(multiplier): "
space: .asciiz " "
result: .asciiz "The product, using my program is: "
mipMult: .asciiz "The product, using MIPs multu is: "
endLine: .asciiz "\n"
.text
main:
#"welcome" screen
li $v0,4 # code for print_string
la $a0,promptStart # point $a0 to prompt string
syscall # print the prompt
li $v0,4 # code for print_string
la $a0,endLine # point $a0 to prompt string
syscall # print the prompt
#prompt for multiplicand
li $v0,4 # code for print_string
la $a0,getA # point $a0 to prompt string
syscall # print the prompt
#acquire multiplicand
li $v0,5 # code for read_int
syscall # get an int from user --> returned in $v0
move $s0,$v0 # move the resulting int to $s0
move $s4,$s0 #copy of multiplicand to use in multu
#prompt for multiplier
li $v0,4 # code for print_string
la $a0,getB # point $a0 to prompt string
syscall # print the prompt
#acquire multiplier
li $v0,5 # code for read_int
syscall # get an int from user --> returned in $v0
move $s1,$v0 # move the resulting int to $s0
move $s5,$s1 #copy of multiplier to use in multu
jal MyMult
j print
MyMult:
#$s2 -> lw product, $s1 -> hw multiplier, $s0 -> multiplicand
beq $s1, $0, done # if multiplier=0--> mult gives 0
beq $s0, $0, done
move $t0, $0 #initialize 'counter'= 31
add $t0, $t0, 31
move $s2, $0 #initialize product = 0
loopOut:
beq $t0, $0, done #loop check
andi $t1, $s1, 1 #Stores LSB(MSB?) of $s1 in $t1
bne $t1, $0, loopIn #check if LSB is equal to 1
srl $s1, $s1, 1
srl $s2, $s2, 1 #right shift product & multiplier
add $t0, $t0,-1 # counter = counter -1
j loopOut
loopIn:
addu $s2, $s2, $s0 #Lw product($s2/$s1)+= multiplicand($s0)
sltu $t2, $s2, $s0 #catch carry-out(0 or 1) and stores in $t2
srl $s1, $s1, 1
srl $s2, $s2, 1 #right shift pro-plier..how to save LSB of $s2?
#add carry-out $t2 to LSB of product $s2
addu $s2, $s2, $t0 #Is this right?
addu $t0, $t0,-1 # counter = counter -1
j loopOut
done:
jr $ra
print:
# print result string
li $v0,4 # code for print_string
la $a0,result # point $a0 to string
syscall # print the result string
# print out the result
li $v0,1 # code for print_int
move $a0,$s2 # put result in $a0
syscall # print out result
li $v0,4 # code for print_string
la $a0,space # point $a0 to string
syscall # print the result string
li $v0,1 # code for print_int
move $a0,$s1 # put result in $a0
syscall # print out result
# print the line feed
li $v0,4 # code for print_string
la $a0,endLine # point $a0 to string
syscall # print the linefeed
doMult:
#Do same computation using Mult
multu $s4, $s5
mfhi $t0
mflo $t1
li $v0,4 # code for print_string
la $a0,mipMult # point $a0 to string
syscall
# print out the result
li $v0,1 # code for print_int
move $a0,$t0 # put high in $a0
syscall # print out result
li $v0,4 # code for print_string
la $a0,space # point $a0 to string
syscall # print the result string
# print out the result
li $v0,1 # code for print_int
move $a0,$t1 # put low in $a0
syscall # print out result
# print the line feed
li $v0,4 # code for print_string
la $a0,endLine # point $a0 to string
syscall # print the linefeed
# All done, thank you!
li $v0,10 # code for exit
syscall # exit program
您是否使用過調試器/模擬器來隔離問題? – Jester 2014-11-09 01:56:29
我正在使用PcSpim來模擬程序...我嘗試使用單步執行,但並不確定如何使用它。 除此之外,程序本身不顯示任何錯誤。 – 2014-11-10 07:46:05