我在理解如何在MIPS中平方數然後將(32,14)二進制值轉換爲(8,5)十進制值時遇到一些困難。因爲我需要使用mult函數,所以我知道它包含一個高位和低位的寄存器,然後我會執行一系列位移以允許我一起給我需要的東西,但除此之外,我很迷茫。下面粘貼的是我目前爲止的內容,我可能會或可能不會朝着正確的方向前進。在MIPS中對數字進行平方編碼
P.S.更多背景:我正在這樣做在DE2板上實現。該板有18個開關,每個代表位的位置(如果你「打開」第一和第二個開關,你會平方值3.從我收集的這將意味着我乘以兩個(32,14)二進制價值數相加,最終需要最終因爲這將在董事會中的LED顯示屏上顯示一個(8,5)十進制值。
.text
# HARDCODED $1 <= .1 (429496730)
# HARDCODED $2 <= 10
# HARDCODED $3 <= 100000
# HARDCODED reg30_in ($30) <= 256 for simulation purposes (value of the switch)
add $28, $30, $zero # initialize $28 = value of input
add $29, $zero, $zero
add $30, $zero, $zero
sll $28, $28, 14 # convert the input value into a (32,14) value
add $4, $zero, $zero # initialize x($4) = 0
srl $5, $28, 1 # initialize step($5) = (32,14)input/2
##sll $5, $5, 14 # shift step to convert to (32,14) -- not needed if we already shifted $28??
sqrt: # loop for square root algorithm
mult $4, $4 # {hi,lo} = x^2 in (64,28)
mfhi $6 # move hi part to register 6
srl $6, $6, 18 # shift hi for (32,14) format
mflo $7 # move lo to register 7
sll $7, $7, 14 # shift lo for (32,14) format
or $8, $6, $7 # combine the hi and lo into a converted (32,14) value
sub $9, $8, $28 # val = x^2 - S(input)
bgez $9, gtz # if val >= 0, branch to gtz
add $4, $4, $5 # else x = x + step
srl $5, $5, 1 # step = step/2
bgez $5, sqrt # if step >= 0, go back into loop
j BCD # else continue to BCD for output
gtz: # greater than zero branch
sub $4, $4, $5 # x = x - step
srl $5, $5, 1 # step = step/2
bgez $5, sqrt # if step >= 0, go back into loop
j BCD # else continue to BCD for output
BCD: # function for BCD output to HEX
mult $3, $4 # multiply x value ($4) by 100000
mfhi $5
mflo $6
or $4, $5, $6
srl $4, $4, 13
#Multiply value by 10^5 (100000)
#Shift 13 bits to the right
#If bit 0 is set then add 2
#Shift one bit to the right
# HEX0
mult $4, $1 # {hi,lo} = val*pt_one
mfhi $3 # move hi (whole part) to register 3
mflo $4 # move lo (fractional part) to register 4
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $5 (digit) = hi
sll $5, $5, 0 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX1
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 4 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX2
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 8 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX3
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 12 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX4
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 16 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX5
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 20 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX6
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 24 # shift by appropriate amount for digit placement
or $29, $29, $5
# HEX7
mult $3, $1 # {hi,lo} = remaining_val*pt_one
mfhi $3 # move hi (whole part) to register 4
mflo $4 # move lo (fractional part) to register 5
multu $4, $2 # {hi,lo} = lo*10
mfhi $5 # $6 (digit) = hi
sll $5, $5, 28 # shift by appropriate amount for digit placement
or $30, $29, $5
您可以爲算法添加僞代碼嗎? – wazy
你是什麼意思(32,14)? – markgz