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

DV.*_*DV. 4 assembly mips cpu-registers spim

我写在MIPS某些代码,我已经来到这里的要求是存储结果,暂时在点HILO特殊寄存器(均为4个字节宽).这些说明由我掌握:

divu     s,t    lo <-- s div t ; hi <-- s mod t
multu    s,t    hi / lo < -- s * t ;
Run Code Online (Sandbox Code Playgroud)

因此,divu存储除法LO和余数的结果HI,同时multu存储乘法LO(低4字节)和HI(高4字节)的结果.

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

mfhi $v0
mflo $v1
Run Code Online (Sandbox Code Playgroud)

我已经想出了如何将计算结果存储在LO:

ori     $v0,$0,1            # Store result from $a0 into LO
divu    $a0,$v0
Run Code Online (Sandbox Code Playgroud)
  • divu在LO分工的结果保存,所以我只是除以1的结果得到它.

但是,存储HI更复杂.一种方法是强制multu指令将值移位32位(4字节):

multu    $a0,0x80000000     # Shift $a0 by 32 bits and store into HI/LO
Run Code Online (Sandbox Code Playgroud)

但是,其结果是,在价值HI是它应该是(所以如果我的值是1个右0100 1000,然后HI将包含0010 0100).

有谁知道如何在HI寄存器中存储东西?

Tom*_*Tom 7

我想扩展Nils Pipenbrinck的回答:

来自MIPS32 arquitechture的程序员

MTHI

格式:MIPS32(MIPS I)

  MTHI rs
Run Code Online (Sandbox Code Playgroud)

目的:将GPR复制到专用HI寄存器

Description: HI ? rs
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

历史信息:

在MIPS I-III中,如果前两个指令中的任何一个是MFHI,那么MFHI的结果是不可预测的.必须将HI或LO特殊寄存器的读取与通过两条或更多条指令写入的后续指令分开.在MIPS IV及更高版本中,包括MIPS32和MIPS64,此限制不存在.

mtlo

格式:MIPS32(MIPS I)

    MTLO rs
Run Code Online (Sandbox Code Playgroud)

目的:将GPR复制到专用LO寄存器描述:

 LO ? rs
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

历史信息:

在MIPS I-III中,如果前两个指令中的任何一个是MFHI,那么MFHI的结果是不可预测的.必须将HI或LO特殊寄存器的读取与通过两条或更多条指令写入的后续指令分开.在MIPS IV及更高版本中,包括MIPS32和MIPS64,此限制不存在.


Nil*_*nck 6

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
Run Code Online (Sandbox Code Playgroud)

这些指令很少见,通常不会出现在汇总指令集引用中.

顺便说一下:务必查看处理器手册,了解LO/HI注册涉及的延迟和危险.它们非常特殊,您的代码可能需要在写入和读取之间至少等待三个周期.不幸的是,这种行为取决于您正在使用的CPU.

对于有抱负的MIPS程序员来说,错误是一个常见的陷阱:-)