Выводит с плавающей запятой

#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 и наоборот.