[英]Storing values in HI and LO registers of MIPS
我正在用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的回答:
来自MIPS32 arquitechture的程序员
格式:MIPS32(MIPS I)
MTHI rs
目的:将GPR复制到专用HI寄存器
Description: HI ← rs
GPR rs的内容被加载到专用寄存器HI中。
限制:
在将新结果写入HI或LO之前,必须由MFHI或MFLO读取由DIV,DIVU,MULT或MULTU写入HI / LO对的计算结果。 如果在遵循这些算术指令之一但在MFLO或MFHI指令之前执行MTHI指令,则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的结果是不可预测的。 必须将HI或LO特殊寄存器的读取与通过两条或更多条指令写入的后续指令分开。 在MIPS IV及更高版本中,包括MIPS32和MIPS64,此限制不存在。
格式:MIPS32(MIPS I)
MTLO rs
目的:将GPR复制到专用LO寄存器描述:
LO ← rs
GPR rs的内容被加载到专用寄存器LO中。
限制:在将新结果写入HI或LO之前,必须由MFHI或MFLO读取由DIV,DIVU,MULT或MULTU写入HI / LO对的计算结果。
如果在遵循这些算术指令之一但在MFLO或MFHI指令之前执行MTLO指令,则HI的内容是不可预测的。 以下示例显示了这种非法情况:
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的结果是不可预测的。 必须将HI或LO特殊寄存器的读取与通过两条或更多条指令写入的后续指令分开。 在MIPS IV及更高版本中,包括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注册涉及的延迟和危险。 它们非常特殊,您的代码可能需要在写入和读取之间至少等待三个周期。 不幸的是,这种行为取决于您正在使用的CPU。
对于有抱负的MIPS程序员来说,错误是一个常见的陷阱:-)
想想当用作multu / divu的第二个参数时,其他极值会产生什么有趣的结果(我有意模糊,因为这看起来像是一个家庭作业问题)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.