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) 我也尝试使用 .d 而不是 .s;(2) 我还尝试使源寄存器和目标寄存器不同($f0to$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- 顺序rdrs应该如上。

4

1 回答 1

2

添加 acvt.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
于 2013-10-17T18:37:28.633 回答