gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:30:07 26 4
gpt4 key购买 nike

我正在 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 将结果存储在 LOLO(低 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 1000HI 将包含 0010 0100)。

有人知道如何在 HI 寄存器中存储内容吗?

最佳答案

我想扩展 Nils Pipenbrinck 的回答:

来自程序员的 MIPS32 架构

mthi

格式:MIPS32 (MIPS I)

  MTHI rs

目的:将 GPR 复制到特殊用途 HI 寄存器

Description: HI ← rs

GPR rs 的内容被加载到特殊寄存器 HI 中。

限制:

由 DIV、DIVU、MULT 或 MULTU 写入 HI/LO 对的计算结果必须由 MFHI 或 MFLO 读取在将新结果写入 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 特殊寄存器的读取必须与写入它们的任何后续指令分开 2或更多说明。在MIPS IV及更高版本中,包括MIPS32和MIPS64,不存在此限制。

mtlo

格式:MIPS32 (MIPS I)

    MTLO rs

目的:将 GPR 复制到特殊用途 LO 寄存器说明:

 LO ← rs

GPR 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
MTLO r6
... # code not containing mfhi
# this mfhi would get an UNPREDICTABLE value
MFHI r3

历史信息:

在 MIPS I-III 中,如果前面两条指令中的任何一条是 MFHI,则该 MFHI 的结果是不可预测的。HI 或 LO 特殊寄存器的读取必须与写入它们的任何后续指令分开 2或更多说明。在MIPS IV及更高版本中,包括MIPS32和MIPS64,不存在此限制。

关于assembly - 将值存储在 MIPS 的 HI 和 LO 寄存器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/823896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com