将整数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)我也试过.d而不是.s; (2)我还尝试使源和目标寄存器不同($f0
到$f2
,然后返回)。
我的结果是1(如果我代替,0)。但是,如果我将* -ed行注释掉,则9来回转移:9打印。
我在传输后(在传输回CPU之前)添加了一个系统调用“print_double”(= 3)来打印传输的数字,并打印一个非常小的正数。
我的问题:
(a)发生了什么事?
(b)mtc1
:是从CPU接收的整数,是双重还是单个?在使用mfc1
发回之前,它需要是单个还是双个,还是无关紧要? (我尝试使用cvt.d.s
等无济于事)
备注:我正在使用“计算机组织与设计”(Patterson,Hennessy)来做这件事。第4版的附录B.10中mtc1
的语法错误 - rd
和rs
的顺序应与上述相同。
答案 0 :(得分:2)
添加cvt.s.w
以将加载的整数转换为单精度浮点可以解决问题:
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