将整数 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
to$f2
和 back)。
我的结果是 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
应该如上。