在MARS mips中,我得到当前的时间:
li $v0, 30
syscall
然后我尝试将系统时间64位移到coprocessor1来对数字进行一些计算:
mtc1.d $a0, $f0
问题在于右侧的检查员,它告诉我$ f0中的双重值是我预期的其他值。 如果我使用十六进制并使用Google将其转换为十进制,则结果与MIPS在更改为十进制视图时显示的结果不同。我知道谷歌是正确的,所以我不正确地移动数据? 如何在coprocessor1中正确移动系统时间对其进行算术运算?
答案 0 :(得分:1)
根据http://www.ece.lsu.edu/ee4720/2016/lfp.s.html,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
如果你有两个32位半部分的64位时间戳,你将不得不将它转换为2部分并添加,或者如果MIPS有一条指令,则在FP寄存器中组合成64位整数为了那个原因。或者是mtc1.d
复制64位整数寄存器? (我没有使用MARS,我不确定它是否只模拟经典MIPS,或者它是否模拟了64位MIPS III或者添加了ISA 64位的任何修订版。)