Assembly Xspim模拟器:使用mtc1传输INT

Assembly Xspim模拟器:使用mtc1传输INT,assembly,mips,spim,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,然后再返

将整数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
mfc1
将其发回之前,它需要是单字符还是双字符,还是无关紧要?(我用
cvt.d.s
等进行了试验,但没有结果)


备注:我用“计算机组织与设计”(帕特森,轩尼诗)来做这件事是为了好玩。第四版附录B.10中的
mtc1
语法错误-rd和
rs
的顺序应如上所述。

添加
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

非常感谢。现在对我也有用。这显然也回答了(b)在转移后,首先需要制作一个双精度(cvt.d.w)或单精度(cvt.s.w)浮动。