如何在MIPS中移动双倍?

时间:2016-11-08 02:28:42

标签: assembly double mips

我试图从用户那里读取一个double,然后将它存储在一个临时寄存器中,如下所示:

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

我收到错误:

" $ t0":操作数类型不正确

对此使用的正确类型是什么?

1 个答案:

答案 0 :(得分:2)

$t0不是浮点寄存器,因此您无法mov.d。改为使用其他浮点寄存器之一($f1..$f31)。由于双精度占用两个相邻的浮点寄存器,因此应移至偶数浮点寄存器之一($f2, $f4, ..., $f30)。

如果确实希望将$f0的值放在$t0中,则必须先将其转换为单精度浮点数然后再使用{ {1}}:

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 现在将包含一个浮点数,因此在整数算术运算中它将毫无用处。

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

$t0

因此,如果您最初在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最终将取决于当前的四舍五入模式。