MIPS指令中lui后执行ori操作与add操作的区别是什么?
MIPS 32位立即数构造问题解答
你的实现存在两处问题:
- 数值匹配错误:你需要构造的目标值是
3*2^16 + 9,但你写的addi $t0,$t0,3最终得到的结果是3*2^16 + 3,和目标值偏差6,属于硬编码错误。 - 通用性缺陷:就算你把
addi的立即数修改为9,这种写法也存在适用边界问题。addi属于带符号加法指令,其16位立即数会做符号扩展:如果低16位的立即数最高位为1(即立即数≥32768),扩展得到的32位立即数高16位全为1,和lui设置的高16位相加会产生进位,直接破坏你之前存入的高16位数值,导致最终结果完全错误。
两种操作的核心区别:
- 立即数扩展规则不同:
addi对16位立即数做符号扩展,ori对16位立即数做零扩展(扩展后高16位固定为0)。 - 对高16位的影响不同:
ori是按位或操作,零扩展后的高16位全为0,完全不会修改lui设置的高16位内容,只会精准填充低16位,逻辑可控性极强,是MIPS架构下构造32位立即数的标准范式。而addi是算术加法操作,符号扩展后的立即数可能和高16位产生进位,无法保证高16位值不变,仅在低16位立即数为正且小于32768时能得到正确结果,通用性极差。
内容的提问来源于stack exchange,提问作者user9178840
相关产品推荐
相关产品推荐

