Assembly 在MIPS的HI和LO寄存器中存储值
我正在MIPS中编写某些代码,现在的要求是将结果临时存储在Assembly 在MIPS的HI和LO寄存器中存储值,assembly,mips,cpu-registers,spim,Assembly,Mips,Cpu Registers,Spim,我正在MIPS中编写某些代码,现在的要求是将结果临时存储在HI和LO特殊寄存器中(两个寄存器都是4字节宽)。我可以使用以下说明: divu s,t lo <-- s div t ; hi <-- s mod t multu s,t hi / lo < -- s * t ; 我已经知道如何将计算结果存储在LO: ori $v0,$0,1 # Store result from $a0 into LO divu $a0
HI
和LO
特殊寄存器中(两个寄存器都是4字节宽)。我可以使用以下说明:
divu s,t lo <-- s div t ; hi <-- s mod t
multu s,t hi / lo < -- s * t ;
我已经知道如何将计算结果存储在LO
:
ori $v0,$0,1 # Store result from $a0 into LO
divu $a0,$v0
将除法的结果存储在LO中,所以我只需将结果除以1即可divu
HI
中存储更为复杂。一种方法是强制multu
指令将值移位32位(4字节):
但是,结果是,HI
中的值正好是它应该在的位置的1位(因此,如果我的值是0100 1000
,那么HI
将包含0010 0100
)
有人知道如何在
HI
寄存器中存储内容吗?想想,当用作multu/divu的第二个参数时,还有哪些极值可能会产生有趣的结果(我故意含糊其辞,因为这看起来像是一个家庭作业问题)。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 REG涉及的延迟和危险。它们非常特殊,您的代码可能需要在写入和读取之间至少等待三个周期。不幸的是,这种行为取决于您使用的CPU
对于有抱负的MIPS程序员来说,犯这个错误是一个常见的陷阱:-)我想扩展Nils Pipenbrick的答案: 来自MIPS32程序员的arquitechture 姆蒂 格式:MIPS32(MIPS I) 目的: 将探地雷达复制到专用HI寄存器
Description: HI ← rs
探地雷达的内容被加载到专用寄存器HI中
限制:
由DIV、DIVU、MULT或MULTU写入HI/LO对的计算结果必须由MFHI或MFLO读取
在将新结果写入HI或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
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)中,此限制不存在
mtlo
格式:MIPS32(MIPS I)
目的:
将GPR复制到专用LO寄存器
说明:
LO ← rs
探地雷达的内容被加载到特殊寄存器LO中
限制:
通过DIV、DIVU、MULT或MULTU写入HI/LO对的计算结果必须由MFHI或MFLO读取,然后才能将新结果写入HI或LO
如果MTLO指令在这些算术指令之一之后执行,但在MFLO或MFHI指令之前执行,则HI的内容是不可预测的。
以下示例显示了这种非法情况:
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
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,这个限制是不存在的。谢谢,这确实是我忽略的。不要认为使用multu和divu可以在HI/LO寄存器中存储值,因为每个指令完全覆盖两个寄存器,除非非常小心:(该死的MIPS.32位(8字节).uh,32b是4个字节,而不是8个。在32位MIPS上,HI和LO分别是4个字节。这是该对的64位串联,即8个字节(不适合任何单个寄存器)。
LO ← rs
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