如何将系统时间正确移动到coprocessor1?

How to move system time to coprocessor1 correctly?

在 MARS mips 中,我通过以下方式获取当前时间:

li $v0, 30
syscall

然后我尝试将 64 位的系统时间移动到协处理器 1 以对数字进行一些计算:

mtc1.d $a0, $f0

问题出在右侧的检查器中,它向我显示 $f0 中的双精度值与我预期的不同。 如果我采用十六进制并使用 Google 将其转换为十进制,则结果与我更改为十进制视图时 MIPS 显示的结果不同。我知道 Google 是正确的,所以我没有正确移动数据? 如何正确移动coprocessor1中的系统时间对其进行运算?

根据http://www.ece.lsu.edu/ee4720/2016/lfp.s.htmlmtc1.d只是移动复制整数位模式。

您必须使用 cvt.d.w $f0, $f0$f0 中的位模式从 int 转换为 double

他们举了个例子:

    addi $t1, [=10=], 1    # Integer 1
    mtc1 $t1, $f1
    cvt.s.w $f1, $f1      # $f1 = single-precision float 1.0
    add.s $f3, $f1, $f2   # FP add to $f2

如果你有一个 64 位时间戳分为两个 32 位的一半,你将不得不将它转换成两部分并添加,或者在 FP 寄存器中组合成一个 64 位整数,如果 MIPS 有一个指令。还是 mtc1.d 复制一个 64 位整数寄存器? (我没有使用过 MARS,我不确定它是否只模拟经典 MIPS,或者它是否模拟 64 位 MIPS III 或添加了 ISA 64 位的任何修订版。)