2014-02-27 52 views
0

所以我寫一個程序,應具備以下條件:打印出來使用MIPS整數小數點後五位命令

編寫一個彙編程序,讀取一系列從控制檯整數。有效條目介於-110和120(含)之間。如果條目無效,則條目將被拒絕,並將錯誤消息打印到屏幕上。當輸入-467時,讀數停止。輸入-467後,程序僅使用MIPS整數命令顯示條目數量,條目總數和條目平均值至5個小數位數。至少會有3個子程序。第一個沒有收到參數的'read_int',返回在合適的寄存器中讀取的有效數字的總數和計數。第二個'print_count_total'在第一個子程序返回的參數中接收參數並且沒有參數。它輸出正確標記在屏幕上的計數和總數。第三個'print_average'在第一個子程序返回的參數中接收參數並且沒有參數。它僅使用整數命令將讀取的數字的平均值輸出到5個小數位。

我有一切工作,但如何將整數平均打印到小數點後五位?例如像:

enter image description here

整數平均應該打印輸出爲71 。

這是我的代碼:

########################################################### 
#  Program Description 
# 
# 
# Reads integers from the keyboard and displays the total 
# number of entries, sum, and integer average 
# Reads until -1 is entered 
# Only accepts values between 10 and 99 (inclusive) 
# 
# 
# t0 = 0  # Total 
# t1 = 0  # Count 
# t2 = -110  # Min 
# t3 = 120  # Max 
# t4 = -467  # Stop 
# 
########################################################### 
#  Register Usage 
# $t0 Running total 
# $t1 Entry count 
# $t2 Minimum value 
# $t3 Maximum value 
# $t4 Stop value 
# $t5 Entry (from user) 
########################################################### 
     .data 
enter_p: .asciiz "Enter a value between -110 and 120 (inclusive): " 
invalid_p: .asciiz "Invalid value\n\n" 
count_p: .asciiz "\n\nNumber of entries: " 
total_p: .asciiz "\nTotal: " 
average_p: .asciiz "\nInteger average: " 
noentry_p: .asciiz "\n\nNo valid values entered\n" 

########################################################### 
     .text 
main: 
    # Initialize values 
    li $t0, 0  # Total 
    li $t1, 0  # Count 
    li $t2, -110  # Min value 
    li $t3, 120  # Max value 
    li $t4, -467  # Stop value 

readLoop: 
    # Get value 
    li $v0, 4 
    la $a0, enter_p 
    syscall   # Prompt for value 
    li $v0, 5 
    syscall   # Read entry 

    # Validate value 
    beq $v0, $t4, getResults 
    blt $v0, $t2, entryInvalid 
    bgt $v0, $t3, entryInvalid 

    # If program gets here, the entry is valid 
    add $t0, $t0, $v0 # Add entry to total 
    addiu $t1, $t1, 1 # Increment counter 

    b readLoop   # Loop 

entryInvalid: 
    li $v0, 4 
    la $a0, invalid_p 
    syscall   # Print error message 

    b readLoop  # Go back and read more 

getResults: 
    beqz $t1, zeroEntries # Prevent divide by 0 

    # Display number of entries 
    li $v0, 4 
    la $a0, count_p 
    syscall   # Print 'count' string 
    li $v0, 1 
    move $a0, $t1 
    syscall   # Print count 

    # Display total 
    li $v0, 4 
    la $a0, total_p 
    syscall   # Print 'total' string 
    li $v0, 1 
    move $a0, $t0 
    syscall   # Print total 

    # Calculate and display average 
    li $v0, 4 
    la $a0, average_p 
    syscall   # Print 'average' string 
    li $v0, 1 
    div $a0, $t0, $t1 # Put results directly into $a0 
    syscall   # Print average 

    b mainEnd  # Done 

zeroEntries: 
    li $v0, 4 
    la $a0, noentry_p 
    syscall   # Print 'no entries' message 

mainEnd: 
    li $v0, 10  # End Program 
    syscall 
########################################################### 

任何幫助深表感謝。

回答

2

要打印小數部分,將除法餘數乘以10^5 = 100000並再次除法。在小數點後打印,注意使用適量的零填充。

+0

謝謝你,小丑。我理解你的算法,但是在實際代碼中看起來如何呢?我的程序中應該放置哪些代碼?我假設它需要放在代碼塊中的某處,我*#計算並顯示平均值*。感謝您的幫助。 – zokiboi

+0

這些都是非常簡單的步驟,可以通過您已知的說明來執行。哪一部分讓你頭痛? – Jester

+0

我很確定自己我知道那些會執行你建議的算法的指令,但是按照正確的順序執行必要的步驟是我無法理解的。那麼部門的其餘部分是否被放入HI或LO寄存器?再次謝謝,小丑。 – zokiboi