Так что я пишу программу, которая должна иметь следующие требования:Печати из пяти знаков после запятой, используя MIPS число команд
Напишите программу сборки, которая считывает ряд целых чисел от консоли. Допустимые значения: от -110 до 120 (включительно). Если запись недействительна, запись отклоняется и на экран выводится сообщение об ошибке. Чтение останавливается при вводе -467. После ввода -467 программа отображает количество записей, сумму записей и среднее значение записей до 5 знаков после запятой, используя только команды MIPS Integer. Будет не менее 3 подпрограмм. Первый «read_int», который не принимает аргументов и возвращает общее количество и количество действительных чисел, считанных в соответствующих регистрах. Второй «print_count_total», который получает в качестве аргументов аргументы, возвращаемые первой подпрограммой, и не содержит аргументов. Он выводит счет и общее количество, помеченное на экране. Третий «print_average», который получает в качестве аргументов аргументы, возвращенные первой подпрограммой, и не имеет аргументов. Он выводит среднее число чисел, считанных в 5 десятичных знаков, используя только целые команды.
У меня все работает, но как бы напечатать целое число до пяти знаков после запятой? Как, например:
Целочисленное среднее должно быть напечатано, как 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
###########################################################
Любая помощь очень ценится.
Благодарим вас за это, Шут. Я понимаю ваш алгоритм, но как это будет выглядеть в реальном коде? А где в моей программе должен быть размещен этот код? Я предполагаю, что он должен быть размещен где-то там в блоке кода, где I * # Вычислить и отобразить среднее значение *. Спасибо вам за помощь. – zokiboi
Это довольно простые шаги, которые могут быть выполнены с помощью инструкций, которые вы уже знаете. Какая часть вызывает головную боль? – Jester
Я вполне уверен, что знаю инструкции, которые будут выполнять предложенный вами алгоритм, но выполнение необходимых шагов в правильном порядке - это то, что у меня возникли проблемы с пониманием. Остается ли остаток дивизиона в регистр HI или LO? Еще раз спасибо, Шут. – zokiboi