Assembly 在MIPS的HI和LO寄存器中存储值

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

我正在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,$v0
  • divu
    将除法的结果存储在LO中,所以我只需将结果除以1即可
但是,在
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