储存的价值观在高和LO寄存器的MIPS
-
05-07-2019 - |
题
我写某些特定的代码MIPS和我来点要求是储存的结果,暂时中 HI
和 LO
特别寄存器(两者都是4个字节的宽)。这些指示是在我的处置:
divu s,t lo <-- s div t ; hi <-- s mod t
multu s,t hi / lo < -- s * t ;
所以, divu
商店结果的分裂在 LO
和剩余在 HI
, 同时 multu
商店的结果乘法 LO
(下4个字节), HI
(较高的4个字节)。
后来,检索结果 HI
和 LO
寄存器,我可以:
mfhi $v0
mflo $v1
我已经想通了如何储存计算结果在 LO
:
ori $v0,$0,1 # Store result from $a0 into LO
divu $a0,$v0
- 的
divu
商店的结果,该司在LO,所以我只是分裂的结果1以得到它。
然而,存在 HI
更为复杂。一个办法是将力 multu
指令移价值的32位(4个字节):
multu $a0,0x80000000 # Shift $a0 by 32 bits and store into HI/LO
但是,结果是,在价值 HI
是1比特权,它应该(如果是我的价值 0100 1000
然后 HI
将包含 0010 0100
).
没有人知道如何储存的东西 HI
注册?
解决方案
我想延长Nils Pipenbrinck的回答:
从MIPS32arquitechture的程序员
mthi
格式:MIPS32(MIPS I)
MTHI rs
目的:复制一个雷达给特别用途高登记册
Description: HI ← rs
该GPR rs的内容载入特别的注册嗨
限制:
计算结果写入高低对通过DIV处理多,或MULTU必须读通过MFHI或MFLO 前一个新的结果可以写入高或LO。如果一个MTHI指令的执行以下一些算法指令,但在此之前的一个MFLO或MFHI 指令,其内容LO是不可预知的。以下例子显示了这一非法情况:
MUL r2,r4 # start operation that will eventually write to HI,LO
... # code not containing mfhi or mflo
MTHI r6
... # code not containing mflo
# this mflo would get an UNPREDICTABLE value
MFLO r3
历史的信息:
在MIPS I-III,如果任的前两项指令是MFHI,结果,MFHI是不可预测的。读高中或LO特殊的登记册必须是分离的任何后续的指示写信给他们两个 或多个指令。在MIPS四和之后,包括MIPS32与MIPS64,这种限制并不存在。
mtlo
格式:MIPS32(MIPS I)
MTLO rs
目的:复制一个雷达给特别用途LO登记册 说明:
LO ← rs
该GPR rs的内容载入特别的注册LO。
限制:计算结果写入高低对通过DIV处理多,或MULTU必须读通过MFHI或MFLO前一个新的结果可以写入高或LO。
如果一个MTLO指令的执行以下一些算法指令,但在此之前的一个MFLO或MFHI指令,其内容嗨是不可预知的。以下例子显示了这一非法情况:
MUL r2,r4 # start operation that will eventually write to HI,LO
... # code not containing mfhi or mflo
MTLO r6
... # code not containing mfhi
# this mfhi would get an UNPREDICTABLE value
MFHI r3
历史的信息:
在MIPS I-III,如果任的前两项指令是MFHI,结果,MFHI是不可预测的。读高中或LO特殊的登记册必须是分离的任何后续的指示写信给他们两个 或多个指令。在MIPS四和之后,包括MIPS32与MIPS64,这种限制并不存在。
其他提示
MIPS指令,设有一个对应对MFLO/MFHI.
这就是所谓MTLO/MTHI和不正是你想要的:
mtlo $v0 # moves the contents of v0 into the lo-register
mthi $v1 # moves the contents of v1 into the hi-register
这些说明是罕见,往往不存在汇总的指示设置的引用。
顺便说一句:一定要检查处理手册》关于延迟和危险的LO/HI regs.他们是非常特殊和你的代码可能需要的东西喜欢等待至少三个周期之间的一个编写和阅读。不幸的是这种行为取决于其CPU你的工作。
得到这一错误是一种常见的缺陷有抱负的维护程序员:-)
考虑什么其他极限值可能会产生有趣的结果时用作第二个参数multu/处理(我是故意模糊的,因为这看起来像一个家庭作业的问题)。