如何将系统时间正确移动到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.html,mtc1.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 位的任何修订版。)
在 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.html,mtc1.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 位的任何修订版。)