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

MIPS编程求助:实现内存中两个32位常数相加并存储结果

解决MIPS内存地址访问与数据相加问题

你的核心问题是混淆了加载内存地址指针和直接加载字面常数,当前代码把0x1200、0x1204拼接成了0x12001200、0x12041204这类32位值存到寄存器,而非构造指向0x1200、0x1204内存地址的指针,再读取对应地址里的实际数据。

正确实现逻辑

MIPS中访问32位内存地址,需先用lui(Load Upper Immediate)加载地址的高16位,再用ori(OR Immediate)补充低16位,构造完整32位地址;之后用lw(Load Word)从该地址读取数据,相加后用sw(Store Word)把结果写入目标地址。

完整代码示例

# 构造第一个数据的地址0x1200,存到$t0
lui $t0, 0x0000       # $t0 = 0x00000000(高16位设为0x0000,低16位清0)
ori $t0, $t0, 0x1200   # $t0 = 0x00001200(低16位补上0x1200,得到完整地址)
lw $s0, 0($t0)         # 从0x1200地址加载32位数据到$s0

# 构造第二个数据的地址0x1204,存到$t1
lui $t1, 0x0000
ori $t1, $t1, 0x1204
lw $s1, 0($t1)         # 从0x1204地址加载32位数据到$s1

# 两个数相加,结果存到$s2
add $s2, $s0, $s1

# 构造目标存储地址0xA200,存到$t2
lui $t2, 0x0000
ori $t2, $t2, 0xA200
sw $s2, 0($t2)         # 把结果$s2存储到0xA200地址

关键指令说明

  • lui $reg, imm16:将16位立即数imm16放入寄存器$reg的高16位,低16位强制设为0。
  • ori $reg_dst, $reg_src, imm16:将寄存器$reg_src的值与16位立即数imm16做按位或,结果存入$reg_dst,用于拼接低16位地址。
  • lw $reg, offset($base):从$base + offset指向的内存地址,读取32位字到$reg。此处offset设为0,直接使用$base指向的地址。
  • sw $reg, offset($base):将$reg中的32位字,写入$base + offset指向的内存地址。

简化写法(针对低16位地址)

如果地址的高16位为0(比如0x1200、0xA200),可以直接用addiu一步构造地址,替代lui+ori组合:

addiu $t0, $zero, 0x1200  # $t0 = 0x00001200,$zero是固定值为0的寄存器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:45:31