2015-11-24 62 views
0

也许我不知道如何使用浮点指令。我想读一个浮点数,做一些操作并将结果再次打印为浮点数,但SPIM在这里给出了一个错误mov.s $f0, $v0。我认为每当使用浮点指令时,我必须给出两个$f寄存器,对吧?但是我怎样才能复制$v0中的某些东西,因为系统调用需要这样做?浮点指令

这是我的代码

.data 0x10010000 
prompt:  .asciiz "Write 0 to °C -> °F\Write 1 for °F ->°C;\n" 
ctof:  .asciiz "Degree in Fahrenheit: " 
ftoc:  .asciiz "Degree in Celsius: " 
error:  .asciiz "Error: write 0 o 1\n\n" 

    .text 0x400000 
main:  la $a0, prompt 
      li $v0, 4 
      syscall   #print prompt 

      li $v0, 5 
      syscall   #read integer 

      beq $v0, 0, c_to_f 
      beq $v0, 1, f_to_c 

      la $a0, error 
      li $v0, 4 
      syscall   #print error 

      j main 

c_to_f:  la $a0, ftoc 
      li $v0, 4 
      syscall   #print ftoc 

      li $v0, 6 
      syscall   #read degree as float 

      mov.s $f0, $v0 
      mul.s $f0, $f0, 9.0 
      div.s $f0, $f0, 5.0 
      add.s $f0, $f0, 32.0 

      la $a0, ctof 
      li $v0, 4 
      syscall   #print ctof 

      move $f12, $f0 
      li $v0, 2 
      syscall   #print result 

      li $v0, 10 
      syscall   #exit 

回答

1

系统调用6(read_float)在$f0,不$v0返回值。所以你的mov.s $f0, $v0是不必要的,因为你已经有了$f0的值。

如果有一个GPR的整数值,并希望将其转换为浮点并将其放置在一个浮点寄存器,然后你可以做如下:

mtc1 $v0,$f0  # Move the value of $v0 into $f0 
cvt.d.w $f12,$f0 # Convert the integer value in $f0 into a double-precision 
       # floating-point value and place the result in $f12 

咨询程序员MIPS32™架构 第二卷:MIPS32™指令集如果您想了解更多关于cvtmtc1的说明。

+0

假指令'mul.s $ f0,$ f0,9.0'和下面的其他两个呢? Spim给我一个语法错误。不使用'$ at'来转换指令?我应该使用'li.s $ f1,9.0'将常量放在'$ f'寄存器中吗? – Shika93

+1

SPIM可能不支持这些伪指令。你应该可以像你所建议的那样使用'li.s'。请注意,如果在其余代码中使用单精度浮点数,则在将整数转换为浮点时,应该使用'cvt.s.w'而不是'cvt.d.w'。 – Michael

+0

当然!谢谢! – Shika93