2015-11-24 61 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