【问题标题】:Is there any alternative use load immediate? [duplicate]是否有任何替代使用立即加载? [复制]
【发布时间】:2021-04-13 22:56:18
【问题描述】:

Load immediate 加载具有立即可用值的寄存器(不进入内存)。 我的问题是如何在不使用立即加载的情况下加载具有值的寄存器?

li $1,100 # 我不想用这个方法。

【问题讨论】:

  • 为什么不能使用li?这就是为此目的的说明。另外,您正在为什么架构编程?
  • 实际上是我的作业:/
  • li 是一个伪指令。您可以写出汇编程序将为您生成的等效指令。例如,ori $1, $0, 100

标签: assembly mips


【解决方案1】:

对于任何接受立即数的操作,您可以将另一个操作数设置为该操作的identity elementx = op(x, I)。以下是一些选项:

  • 加或减0
  • 与 0 执行按位或
  • 对所有 1 执行按位与(2 的补码中的 -1)
  • 乘以或除以 1

【讨论】:

  • 如何将所需的常数乘以或除以 1? MIPS mult 和 div 指令不采用立即操作数 (uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf),即使他们这样做(例如通过伪指令),您也已经需要一个操作数在寄存器中,所以您有鸡/蛋问题。与 -1 的 AND 也有同样的问题,尽管我猜你可以使用 nor $dst, $zero, $zero 创建它。您可以通过$zero 寄存器轻松访问的唯一常量是0。此外,没有直接的子;你必须通过添加一个否定来模仿它。
  • 所以您的选项是 ADDIU 用于 -32768..36767 范围,或者像 ORI 或 XORI 之类的逻辑用于 0..65535 范围。或者lui 是 65536 的倍数。我认为没有其他真正可行的方法。
  • @PeterCordes 之前没有 MIPS 标签,所以我指的不是特定的 ISA。你是对的,零通常可用作硬连线寄存器,或者你可以从自身中减去一些东西或与自身进行按位异或。但是您可以使用 CISC 中的 incdec 类指令从 0 得到 1 或 -1,或者您可以将某物自身除以 (1) 或按位 XNOR 与自身 (-1) 相除。
  • 我从未见过带有 mul 的 ISA 可能需要 两个 立即数,因为那将毫无意义,而且您应该在组装时做一些事情。如果存在立即除法,通常会将除数作为立即数(例如 x86 的 AAM),因此您已经需要在寄存器中使用常量。我认为 mul 和 div 不太可能有帮助(而且性能更差),甚至不值得一提。我明白你关于为操作查找标识元素的观点,但也许你可以在关于标识元素的段落中提到这一点。
  • IDK,也许您正试图通过提出深奥的替代方案来扩展问题的受限指令集方面,即使这需要更多指令来为它们构造常量。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2011-05-06
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多