2013-06-24 57 views
0

我在理解如何在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 
+0

您可以爲算法添加僞代碼嗎? – wazy

+0

你是什麼意思(32,14)? – markgz

回答

1

除非我誤解你的問題,在MIPS平方一些很簡單,如果你被允許使用的MULT操作。

這裏是平方和打印17

.text 

main:  
    addi $t0 $zero 17 

    mult $t0 $t0 

    mflo $a0 
    addi $v0 $zero 1 
    syscall 

    jr $ra 
的例子

當使用mult操作時,乘法的結果可能溢出32位,所以下部分放在lo寄存器中,hi部分放在高位中。上面的例子忽略了hi寄存器的值,所以如果平方數溢出32位將是錯誤的,但是你在這種情況下做什麼很難說沒有上下文。

+0

更多背景:我正在做這個在DE2板上實現。該板有18個開關,每個代表位的位置(如果你「打開」第一和第二個開關,你會平方值3.從我收集的這將意味着我乘以兩個(32,14)二進制最終需要最終以(8,5)十進制值的形式顯示在板上的LED顯示屏上 – user2517978

+0

@ user2517978那麼,這個問題如何從開關中讀取並生成一個數字?問題如何顯示一個數字在十進制? –

+0

我明白如何閱讀開關,我相信我知道如何顯示在十進制,只是不完全有平方部分下來。 – user2517978