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
相关产品推荐
相关产品推荐

