Assembly 如何将系统时间正确移动到协处理器1?
在MARS mips中,我通过以下方式获取当前时间: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仅移动复制整数位模
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)。