1
我想读取用户的双,然后将其存储在一个临时寄存器,就像这样:如何在MIPS中移动双精度值?
li $v0, 7 #syscall for reading double = 7
syscall
mov.d $t0, $f0 #t0= number of gallons
我得到一个错误:
“$ T0”:操作数是不正确的类型
这是什么类型的正确使用?
我想读取用户的双,然后将其存储在一个临时寄存器,就像这样:如何在MIPS中移动双精度值?
li $v0, 7 #syscall for reading double = 7
syscall
mov.d $t0, $f0 #t0= number of gallons
我得到一个错误:
“$ T0”:操作数是不正确的类型
这是什么类型的正确使用?
$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
你想最终要么3
或4
在$t0
取决于当前舍入模式。
谢谢,但现在我试图比较双重值为零,它不工作。我有'b2 $ f2,$ zero,loop',它应该在等于零时分支,但是我有一个错误,说“$ f2”:操作数的类型不正确。我如何将这个值与零比较? – Joe123
您可以将要比较的double值(在'0.0'的情况下)加载到其他浮点寄存器(比如'$ f2')中,然后进行浮点比较:'c.eq.d $ f0 ,$ f2',然后你可以根据与'bc1f'或'bc1t'(例如'bc1t f0_is_zero')的比较来进行分支。我建议您下载适用于程序员的_MIPS32™架构第二卷:MIPS32™指令集。 – Michael