Assembly 如何将系统时间正确移动到协处理器1?

Assembly 如何将系统时间正确移动到协处理器1?,assembly,mips,mars-simulator,Assembly,Mips,Mars Simulator,在MARS mips中,我通过以下方式获取当前时间: li $v0, 30 syscall 然后我尝试将系统时间(64位)移动到协处理器1,以对数字进行一些计算: mtc1.d $a0, $f0 问题出在右边的检查器中,它向我显示$f0中的双精度值超出了我的预期。 如果我使用Google将十六进制转换为十进制,结果与我更改为十进制视图时MIPS显示的结果不同。我知道谷歌是正确的,所以我没有正确移动数据? 如何正确移动协处理器1中的系统时间以在其上执行算术?根据,mtc1.d仅移动复制整数位模

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

li $v0, 30
syscall
然后我尝试将系统时间(64位)移动到协处理器1,以对数字进行一些计算:

mtc1.d $a0, $f0
问题出在右边的检查器中,它向我显示$f0中的双精度值超出了我的预期。 如果我使用Google将十六进制转换为十进制,结果与我更改为十进制视图时MIPS显示的结果不同。我知道谷歌是正确的,所以我没有正确移动数据? 如何正确移动协处理器1中的系统时间以在其上执行算术?

根据,
mtc1.d
仅移动复制整数位模式

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

他们举了一个例子:

    addi $t1, $0, 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位的一半,你必须将它转换成两个部分,然后加上,或者如果MIPS有一个64位整数的指令,在FP寄存器中合并成一个64位整数。或者
mtc1.d
正在复制64位整数寄存器?(我没有使用MARS,我不确定它是否只模拟了经典的MIPS,或者是否模拟了64位MIPS III或添加了ISA 64位的任何修订版。)

我通过使用我创建的一些64个子例程进行计算,成功地做到了这一点。我只需要加减来计算时差。但你在转化方面是对的。一旦我做了计算,当我移动到浮点寄存器时,我需要将值转换为双精度。@Romeo:你的意思是你刚刚使用了64位整数数学?这听起来很合理
double
不能精确表示所有可能的64位整数,最多只能表示2^53。除此之外,随着指数域的增长,两个可表示的
double
之间的距离是2,然后是4,然后是8。基本上是的。这实际上是我遇到的另一个问题:我正在将系统时间返回的值移动到double中,这对于MIPS来说太大了,无法正确地看到它。但是如果我只移动时间差,它看起来是正常的,因为它实际上是一个合理的大小(我想这意味着它是<2^53)。