You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:45:05