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

QTSPIM环境下MIPS汇编加载存储计算异常问题求助

MIPS汇编求和问题:寄存器异常与计算错误的原因及修复

问题根源分析

两段代码的核心问题都是内存地址偏移计算错误,再加上缺少规范的程序入口/退出逻辑,导致读取无关内存、程序跑飞,寄存器值混乱。

初始代码的问题

  1. 偏移量完全错误:.data段中三个.byte是连续存储的,第一个字节地址是0x10000000(QTSPIM默认.data起始地址),第二个是0x10000001,第三个是0x10000002。但你用了0x10、0x14、0x18作为偏移,相当于跳了16、20、24字节,读的都是.data段外的无关内存,自然值不对。
  2. 缺少main函数结构与退出指令:QTSPIM要求程序从main标签开始执行,且执行完后需要调用syscall退出,否则程序会继续执行后续的垃圾指令,导致寄存器值不稳定。
  3. 笔误:lb $t2,0x18 ($10)的注释写错了,但这不是核心问题。

修改后代码的问题

  1. 偏移量仍错误:第一个.byte的偏移应该是0,不是0x1——lui $t2, 0x1000后,$t2的值是0x10000000,直接加偏移0就能读到第一个13,你加了0x1,读的是第一个字节后面的未知数据,所以t0=14完全不对。
  2. 同样缺少程序退出逻辑:程序执行完求和存储后没有退出,继续跑飞,寄存器值被后续错误指令修改。
  3. 存储地址错误:你想存到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:03:14