整数 9 をコプロセッサーに転送し、その平方根の上限を取得してから、この値を転送して出力するコード:
addi $t1, $zero, 9
mtc1 $t1, $f0
sqrt.s $f0, $f0 # (*)
ceil.w.s $f0, $f0 # (*)
mfc1 $t0, $f0
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
(*) のある行に関する注意: (1) .s の代わりに .d も試しました。(2) ソースレジスタとデスティネーションレジスタを別のものにしてみました ( $f0
to$f2
と back )。
私の結果は 1 です (代わりに発言権を取得した場合は 0)。ただし、*-ed 行をコメントアウトすると、9 が細かく転送され、9 が出力されます。
転送後 (および CPU への転送前) に syscall "print_double" (=3) を追加して、転送された数値を出力すると、非常に小さな正の数値が出力されます。
私の質問:
(a) 何が起こっているのですか?
(b) mtc1
: CPU から転送された整数は double または single として受信されますか? で送り返す前にmfc1
、シングルかダブルか、それとも関係ないか?( などを使って実験しcvt.d.s
ましたが、役に立ちませんでした)
備考: 「コンピュータの構成と設計」(パターソン、ヘネシー) を使用して、楽しみのためにこれを行っています。第 4 版では、mtc1
付録 B.10 に間違った構文があります - と の順序はrd
上記rs
のとおりです。