QTSPIM环境下MIPS汇编加载存储计算异常问题求助
MIPS汇编求和问题:寄存器异常与计算错误的原因及修复
问题根源分析
两段代码的核心问题都是内存地址偏移计算错误,再加上缺少规范的程序入口/退出逻辑,导致读取无关内存、程序跑飞,寄存器值混乱。
初始代码的问题
- 偏移量完全错误:.data段中三个
.byte是连续存储的,第一个字节地址是0x10000000(QTSPIM默认.data起始地址),第二个是0x10000001,第三个是0x10000002。但你用了0x10、0x14、0x18作为偏移,相当于跳了16、20、24字节,读的都是.data段外的无关内存,自然值不对。 - 缺少main函数结构与退出指令:QTSPIM要求程序从
main标签开始执行,且执行完后需要调用syscall退出,否则程序会继续执行后续的垃圾指令,导致寄存器值不稳定。 - 笔误:
lb $t2,0x18 ($10)的注释写错了,但这不是核心问题。
修改后代码的问题
- 偏移量仍错误:第一个
.byte的偏移应该是0,不是0x1——lui $t2, 0x1000后,$t2的值是0x10000000,直接加偏移0就能读到第一个13,你加了0x1,读的是第一个字节后面的未知数据,所以t0=14完全不对。 - 同样缺少程序退出逻辑:程序执行完求和存储后没有退出,继续跑飞,寄存器值被后续错误指令修改。
- 存储地址错误:你想存到
0x1022,实际0x10000000 + 0x13 = 0x10000013,和目标地址不符。
修复后的正确代码
以下是符合QTSPIM要求的代码,包含正确的地址偏移、main函数结构和退出逻辑:
.data num1: .byte 13 # 地址0x10000000 num2: .byte 20 # 地址0x10000001 num3: .byte 150 # 地址0x10000002 result: .space 1 # 预留1字节存结果,地址0x10000003 .text .globl main main: lui $t0, 0x1000 # 加载.data段起始地址0x10000000到$t0 lbu $t1, 0($t0) # 读num1(13)到$t1 lbu $t2, 1($t0) # 读num2(20)到$t2 lbu $t3, 2($t0) # 读num3(150)到$t3 add $t4, $t1, $t2 # 13+20=33,存到$t4 add $t4, $t4, $t3 # 33+150=183,存到$t4 sb $t4, 3($t0) # 把结果183存到result地址(0x10000003) # 程序退出 li $v0, 10 syscall
关键说明
- 用
lbu(无符号字节加载)而不是lb:因为150是大于127的有符号数,lb会把它符号扩展成负数(0xFFFFFF96),求和时结果会出错,lbu会把它当作无符号数(0x96=150),保证计算正确。 - 给每个数据加标签(如
num1):可以直接用标签代替偏移量,比如lbu $t1, num1,更直观不容易错。 - 必须加退出指令:
li $v0,10+syscall是QTSPIM的标准退出方式,避免程序跑飞。
内容的提问来源于stack exchange,提问作者DeusExMachina
相关产品推荐
相关产品推荐

