Xspim模拟器:使用mtc1传输整数

时间:2013-10-17 18:17:31

标签: assembly mips spim

将整数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的语法错误 - rdrs的顺序应与上述相同。

1 个答案:

答案 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