2016-04-22 25 views

答えて

2

浮動小数点をロードする最も簡単な方法は、メモリからロードすることです。

データセクションでは、浮動小数点定数を定義することができます。浮動小数点レジスタにそれらをロードする(ダブル用)

.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 
+0

ている私は、コンパイラを構築するので...内のすべてのdouble値を保存することは非常に困難です(.data)あなたの方法を使うなら、私はすべての二重変数と彼の値を結びつける必要があります...とても難しい – elisha

+0

@elisha:私はあなたの問題を完全に理解していません。浮動小数点定数を直接ロードする別の(トリッキーな)方法があります。更新された答えを参照してください – gusbro

+0

私はあなたの(厄介な)方法を使用する場合私はそれを登録したいすべての二重の値のエンコーディングを計算する必要がありますか? – elisha

0

これは、オペランドを書き込むための方法と非常によく似ています。 最初の違いは、$ 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 
関連する問題