2016-11-08 6 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にはできません。代わりに他の浮動小数点レジスタの1つを使用してください($f1..$f31)。 doubleは隣接する2つの浮動小数点レジスタを占有するため、偶数浮動小数点レジスタの1つに移動する必要があります($f2, $f4, ..., $f30)。


あなた本当には、あなたが最初の単精度浮動小数点数に変換してからmfc1を使用する必要があると思います$t0$f0の値を配置したい場合:

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 

ですから、もともと$f03.14を持っていた場合は、34のいずれかで終わるだろう現在の丸めモードによっては$t0になります。

+0

ありがとうございますが、今は2倍の値をゼロと比較しようとしていますが、動作しません。私は 'bne $ f2、$ zero、loop'を持っていて、ゼロに等しいなら分岐するべきですが、" $ f2 "というエラーがあります:オペランドのタイプが間違っています。値をゼロとどのように比較できますか? – Joe123

+1

他の浮動小数点レジスタ( '$ f2'と言う)に比較したいdouble値(' 0.0'の場合)をロードした後、浮動小数点比較を行います: 'c.eq.d $ f0 、$ f2'とし、その比較に基づいて 'bc1f'や' bc1t'(例えば 'bc1t f0_is_zero')と分岐することができます。私はあなたがプログラマのボリュームIIのための_MIPS32アーキテクチャをダウンロードすることをお勧めします:MIPS32™命令セット_。 – Michael

関連する問題