0

整数 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) ソースレジスタとデスティネーションレジスタを別のものにしてみました ( $f0to$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のとおりです。

4

1 に答える 1

2

cvt.s.wロードされた整数を単精度浮動小数点に変換する a を追加すると、問題が修正されます。

addi $t1, $zero, 36
mtc1 $t1, $f0
cvt.s.w $f0,$f0    # convert the integer in $f0 to floating point
sqrt.s $f0, $f0      
ceil.w.s $f0, $f0  # ceil and convert from floating point to integer 
mfc1 $t0, $f0
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
于 2013-10-17T18:37:28.633 に答える