が組み立てレジスタに整数値を置くための命令(ADDI)があり、私の質問は:MIPSがレジスタに二重の値をロードする方法は? MIPSで
addi $t1,$zero,8.9 #MIPS ERROR
私は私がしなければならない命令MIPSのレジスタにdouble値を入れたい場合つかいます ??
が組み立てレジスタに整数値を置くための命令(ADDI)があり、私の質問は:MIPSがレジスタに二重の値をロードする方法は? MIPSで
addi $t1,$zero,8.9 #MIPS ERROR
私は私がしなければならない命令MIPSのレジスタにdouble値を入れたい場合つかいます ??
浮動小数点をロードする最も簡単な方法は、メモリからロードすることです。
データセクションでは、浮動小数点定数を定義することができます。浮動小数点レジスタにそれらをロードする(ダブル用)
.data
doubleValue: .double 123.456
floatValue: .float 123.456
そして(フロート用)pseudoinstructions l.s
を使用しl.d
。例えば
.text
l.s $f1, floatValue # Loads constant 123.456 onto $f1
l.d $f2, doubleValue # Loads constant 123.456 onto $f2-$f3
別の方法としては、汎用レジスタに浮動小数点数をエンコード即値をロードし、その後、浮動小数点レジスタに移動するmtc1
/mtc1.d
を使用することができます。浮動小数点定数をエンコードする必要があるという意味では、これは難しいことです。
li $t1, 0x42f6e979 # 0x42f6e979 is the encoding for 123.456 single precision float
mtc1 $t1, $f1 # move that float to $f1
をそして、あなたは二重の上に123.456をロードした場合、あなたが発行します:たとえば
は、あなたが浮動小数点レジスタに123.456をロードしたいと言う、あなたはこれを行うことがli $t2, 0x1a9fbe77 # 0x405edd2f1a9fbe77 is the encoding for 123.456 double
li $t3, 0x405edd2f
mtc1.d $t2, $f2 # move that double to $f2-$f3
これは、オペランドを書き込むための方法と非常によく似ています。 最初の違いは、$ t(オペランド番号)の代わりに$ f(オペランド番号)を使用する必要がある点です。
値を即値としてロードすることはできません。値は.data
セクションで宣言する必要があります。
使用する浮動小数点レジスタは偶数でなければなりません。
浮動小数点値をロードするとき、オペコードはl.s
である必要があります。
add.d
コマンドは、これらとして使用する必要があり、二重の値を追加する例えば
と10と2.5
.data
float1 : .float 2.5 # declaring the floating values
float2 : .float 10.0 # declaring the floating values
.text
main :
l.s $f0 , float1 # loading the floating values to regester
l.s $f2 , float2 # loading the floating values to regester
add.d $f4 , $f0 , $f2
ている私は、コンパイラを構築するので...内のすべてのdouble値を保存することは非常に困難です(.data)あなたの方法を使うなら、私はすべての二重変数と彼の値を結びつける必要があります...とても難しい – elisha
@elisha:私はあなたの問題を完全に理解していません。浮動小数点定数を直接ロードする別の(トリッキーな)方法があります。更新された答えを参照してください – gusbro
私はあなたの(厄介な)方法を使用する場合私はそれを登録したいすべての二重の値のエンコーディングを計算する必要がありますか? – elisha