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

MIPS汇编addi指令十六进制立即数解析及运算结果咨询

MIPS汇编addi指令立即数解析与相关问题解答

一、addi指令中十六进制立即数的解析逻辑

MIPS的addi是带符号立即数加法指令,它的立即数固定为16位。无论你用十进制、十六进制还是其他格式书写立即数,汇编器都会先提取该数值的低16位,再对这个16位二进制数做符号扩展到32位:

  • 如果16位立即数的最高位(第15位,从0开始计数)是1,就把高16位全部填充为1;
  • 如果最高位是0,就把高16位全部填充为0。
    最后用扩展后的32位数和源寄存器的值相加,结果存入目标寄存器。

二、两条addi指令的差异对比

看这两条指令:

addi $12,$1,0x0000ffff
addi $12,$1,0xffff

完全没有区别。0x0000ffff和0xffff作为16位立即数是等价的——汇编器会自动忽略高位的无效0,只保留低16位的值。两条指令最终会被汇编成完全相同的机器码,执行效果完全一致。

三、指定代码执行后$12的取值分析

先看给出的代码:

lui $1,0xffffff00
addi $12,$1,0x0000ffff

第一步:lui指令的执行结果

MIPS的lui指令作用是把16位立即数左移16位,结果存入目标寄存器(低16位自动补0)。注意:lui的立即数只能是16位,若书写的数值超过16位,汇编器会自动截断取低16位。
这里0xffffff00的低16位是0xff00,所以执行lui $1,0xffffff00后,$1的值为0xff00 << 16 = 0xff000000。

第二步:addi指令的符号扩展

addi中的立即数0x0000ffff,其低16位是0xffff(二进制为16个1),最高位是1,所以会被符号扩展为32位的0xffffffff(对应十进制的-1)。

第三步:最终$12的计算

将$1的值和扩展后的立即数相加:
0xff000000 + 0xffffffff = 0xfeffffff(模2^32的结果,对应十进制的-65537)。

针对你疑问的明确答复

  • 0x0000ffff必须按符号扩展处理,不能保留原值0x0000ffff——这是addi指令的固定规则,因为它是带符号加法指令。
  • 最终$12的值不是0xff00ffff,如果想要得到这个结果,应该使用无符号立即数指令ori(逻辑或),因为ori会把16位立即数的高16位补0,执行ori $12,$1,0xffff就能得到0xff00ffff。

内容的提问来源于stack exchange,提问作者AVITAL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:10:54