繁体   English   中英

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

[英]Storing values in HI and LO registers of MIPS

我正在用MIPS编写某些代码,我已经到了要求将结果临时存储在HILO特殊寄存器中(两者都是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字节)的乘法结果。

稍后,为了从HILO寄存器中检索结果,我可以:

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的程序员

MTHI

格式: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,此限制不存在。

mtlo

格式: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM