2016-11-08 49 views
1

我想读取用户的双,然后将其存储在一个临时寄存器,就像这样:如何在MIPS中移动双精度值?

li $v0, 7 #syscall for reading double = 7 
syscall 
mov.d $t0, $f0 #t0= number of gallons 

我得到一个错误:

“$ T0”:操作数是不正确的类型

这是什么类型的正确使用?

回答

2

$t0不是浮点寄存器,所以你不能mov.d它。使用其他浮点寄存器之一($f1..$f31)。由于双精度要占用两个相邻的浮点寄存器,所以应该移动到偶数浮点寄存器之一($f2, $f4, ..., $f30)。


如果你真的放置的$f0值在$t0你必须先将其转换为单精度浮点数,然后用mfc1

cvt.s.d $f2,$f0 # convert to single-precision (32-bit) 
mfc1 $t0,$f2  # copy the single-precision float bit-for-bit to GPR $t0 

注意$t0现在将包含一个浮点数,所以在整数算术运算中它将毫无用处。


也有可能以双转换为整数,然后将其移动到GPR:

cvt.w.d $f2,$f0 # convert to integer by rounding (according to the currently set rounding mode) 
mfc1 $t0,$f2  # copy to GPR $t0 

所以,如果你原本3.14$f0你想最终要么34$t0取决于当前舍入模式。

+0

谢谢,但现在我试图比较双重值为零,它不工作。我有'b2 $ f2,$ zero,loop',它应该在等于零时分支,但是我有一个错误,说“$ f2”:操作数的类型不正确。我如何将这个值与零比较? – Joe123

+1

您可以将要比较的double值(在'0.0'的情况下)加载到其他浮点寄存器(比如'$ f2')中,然后进行浮点比较:'c.eq.d $ f0 ,$ f2',然后你可以根据与'bc1f'或'bc1t'(例如'bc1t f0_is_zero')的比较来进行分支。我建议您下载适用于程序员的_MIPS32™架构第二卷:MIPS32™指令集。 – Michael