Assembly 为什么MARS mips 32位立即可用?

Assembly 为什么MARS mips 32位立即可用?,assembly,mips32,mars-simulator,Assembly,Mips32,Mars Simulator,因此,根据我看过的一些资料,在32位mips中不可能使用32位立即数,因为机器指令是32位的,立即数值存储在机器指令中。据我所知,立即数的最大值是16位,以便为指令的其余部分留出空间。但在MARS 4.5 mips中,此指令工作正常(使用默认设置): 这种汇编和运行都很好,这让我感到困惑,因为我认为出于上述原因它不应该(32位机器代码怎么能容纳32位立即数?)。我最好的猜测是,火星上的ori实际上在立即数字段大于0xffff时运行伪指令,lui和ori将定期加载该字段,但我不确定。有人能解释一下

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


这种汇编和运行都很好,这让我感到困惑,因为我认为出于上述原因它不应该(32位机器代码怎么能容纳32位立即数?)。我最好的猜测是,火星上的ori实际上在立即数字段大于0xffff时运行伪指令,lui和ori将定期加载该字段,但我不确定。有人能解释一下吗?

如果您注意到在mars 4.5中汇编该指令时,会得到三条指令

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

这仍然有点误导,但基本上它为您修复了它。

拆解二进制文件,自己看看。事实上,这不应该起作用。请注意,一些指令(如
addi
符号)扩展了立即数,因此
addi$t1、$0、0xffffffff
确实有效。顺便说一句,这是一条汇编程序可以用来代替这里的
ori
的指令。为了进一步强调这一点,在ori指令前后加上一个nop,然后进行汇编,看看它产生了什么。
lui $1,0xFFFFFFFF
ori $1,$1,0x0000FFFF
or $9,$0,$1