1

まず、私はアセンブリ/マシン コードを学習する初心者です。

いくつかのコードを読んでいて、コードが "1.0" を浮動小数点コプロセッサ レジスタに入れるスニピットに出くわしました。

コードは

addi       $t5, $0, 1
mtc1       $t5, $f2
cvt.s.w    $f0, $f2       # 1.0 in $f0

私の最初の質問は次のとおりです。

コプロセッサーに転送する前に、最初に「1」を「$t5」に入れる必要があるのはなぜですか? もっと簡単にできるんじゃないの

addi       $f2, $0, 1

あるいは

addi       $f2, $0, 1.0

私の2番目の質問は次のとおりです。

このコード行の

 cvt.s.w    $f0, $f2       # 1.0 in $f0

2つのレジスターが異なる必要がありますか? それとも両方とも $f2 にできますか?

4

1 に答える 1

1

命令は、その仕様に記載されているレジスタのタイプで動作します。知りたい場合は、それを読んでください。

形式: ADDI rt、rs、即時 MIPS32
目的:
定数を 32 ビット整数に追加します。オーバーフローが発生した場合、トラップします。
説明: rt ← rs + 即値
16 ビットの符号付き即値が GPR rs の 32 ビット値に加算され、32 ビットの結果が生成されます。
• 加算の結果が 32 ビットの 2 の補数算術オーバーフローになる場合、デスティネーション レジスタは変更されず、
整数オーバーフロー例外が発生します。
• 加算がオーバーフローしない場合、32 ビットの結果が GPR rt に格納されます。
制限:
なし
手術:
temp ← (GPR[rs]31||GPR[rs]31..0) + sign_extend(即時)
temp32 ¹ temp31 の場合
SignalException(IntegerOverflow)
そうしないと
GPR[rt] ← 温度
終了
例外:
整数オーバーフロー
プログラミング上の注意:
ADDIU は同じ算術演算を実行しますが、オーバーフローをトラップしません。

そのaddiため、コプロセッサ レジスタを操作することはできません

フォーマット:CVT.SD fd、fs MIPS32
CVT.SW fd、fs MIPS32
CVT.SL fd、fs MIPS64
MIPS32 リリース 2
目的:
FP または固定小数点値を単一の FP に変換するには
説明: fd ← convert_and_round(fs)
fmt 形式の FPR fs の値は、単一浮動小数点形式の値に変換され、次の式に従って丸められます。
FCSR の現在の丸めモード。結果は FPR fd に格納されます。
制限:
フィールド fs および fd は有効な FPR を指定する必要があります。それらが有効でない場合、
結果は予測不可能です。
オペランドは fmt 形式の値でなければなりません。そうでない場合、結果は予測不可能であり、オペランドの値
FPR は予測不可能になります。
CVT.SL の場合、プロセッサが 16 個の FP レジスタで実行されている場合、この命令の結果は予測不能です。
モード。
手術:
StoreFPR(fd, S, ConvertFmt(ValueFPR(fs, fmt), fmt, S))
例外:
コプロセッサ使用不可、予約命令
浮動小数点の例外:
無効演算、未実装演算、不正確、オーバーフロー、アンダーフロー

fd と fs が異なる必要があるとは言っていないので、ソースと宛先のレジスタに関する他のルールが同じでない限り、同じものを使用できます。

于 2012-08-19T07:13:08.370 に答える