【问题标题】:Why is MARS mips 32 bit immediate possible?为什么 MARS mips 32 位立即成为可能?
【发布时间】:2017-03-14 23:46:21
【问题描述】:

因此,根据我查看的一些资料,不可能在 32 位 mips 中使用 32 位立即数,因为机器指令是 32 位的,并且立即数存储在机器指令中。据我所知,最大的立即数可以是 16 位,为指令的其余部分留出空间。但在 MARS 4.5 mips 中,这条指令可以正常工作(使用默认设置):

.text
ori $t1, $0, 0xffffffff #load 32-bit pattern into $t1

这组装和运行良好,这让我感到困惑,因为我认为它不应该出于上述原因(32 位机器代码如何保持 32 位立即数?)。我最好的猜测是,当立即字段高于 0xffff 时,MARS 中的 ori 实际上会运行伪指令,lui 和 ori 会定期加载,但我不确定。有人可以对此有所了解吗?

【问题讨论】:

  • 反汇编二进制文件,自己看看。确实,这应该行不通。请注意,诸如addi 符号之类的某些指令会扩展立即数,因此addi $t1, $0, 0xffffffff 确实有效。顺便说一句,这是汇编程序可以使用的指令,而不是这里的 ori

标签: assembly mips32 mars-simulator


【解决方案1】:

如果您在 mars 4.5 中组装该指令时注意到您会得到三个指令

lui $1,0xFFFFFFFF
ori $1,$1,0x0000FFFF
or $9,$0,$1

这仍然有点误导,但基本上它会为您解决它。

【讨论】:

  • 为了进一步强调这一点,在您的 ori 指令之前和之后放置一个 nop,然后组装,看看它会产生什么。
猜你喜欢
  • 2019-08-12
  • 2020-06-29
  • 2020-07-26
  • 2013-12-03
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多