#assembly #mips
#сборка #mips
Вопрос:
Я просто хотел создать программу, которая считывает значение с плавающей запятой (т. Е. Число с одинарной точностью) с клавиатуры, а затем выводит его, и нет никаких предупреждений или ошибок, но я не смог получить правильные ответы, вместо этого я получил 0.00000000. Что не так с моим кодом? Это мой код:
.data 0x10000000
msg1: .asciiz "Please enter a float: "
.text
.globl main
main: addu $s0, $ra, $0 # save $31 in $16
li $v0, 4 # system call for print_str
la $a0, msg1 # address of string to print
syscall
li $v0, 6 # system call for read_float
syscall # the float placed in $f0
mtc1 $t0, $f0# move the number in $t0
sll $t0, $t0, 4
# print the result
li $v0, 2 # system call for print_float
mfc1 $t0, $f12 # move number to print in $f12
syscall
# restore now the return address in $ra and return from main
addu $ra, $0, $s0 # return address back in $31
jr $ra # return from main
Ответ №1:
У вас есть mtc1
и mfc1
наоборот.
mtc1
означаетGPR -> FPR
mfc1
означаетGPR <- FPR
Итак, если мы посмотрим, что на самом деле делает этот код:
mtc1 $t0, $f0 # Sets $f0 = $t0. You haven't specified a value for $t0 at this point,
# but it doesn't really matter since you're not using $f0 any more
# after this point.
sll $t0, $t0, 4 # Shifts whatever was in $t0 4 bits to the left.
li $v0, 2 # System call for print_float.
mfc1 $t0, $f12 # Set $t0 = $f12.
syscall # Calls print_float without having specified a value for $f12.
Я не понимаю смысла этого сдвига, поскольку вы говорите, что просто хотите напечатать число, которое было прочитано, поэтому приведенный выше код можно заменить на:
mov.s $f12, $f0
li $v0, 2
syscall
Если вы по какой-то причине все же хотите выполнить этот сдвиг, то вам нужно изменить свой mtc1
на mfc1
и наоборот.