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

MIPS运行时异常求助:计算数组累积和时地址越界错误

问题分析与修复方案

错误根源

报错显示访问了0x00000000空地址,核心问题有两个:

  1. 未结合数组基地址与偏移量:代码中sll $t6, $t2, 2仅计算了索引对应的字节偏移(每个int占4字节),但直接用0($t6)作为内存地址,相当于访问以0为起始的非法内存区域——arrayB的实际起始地址不可能是0,必须把数组基地址和偏移量相加得到有效内存地址。
  2. 循环条件逻辑错误:blt $t1, $a0, Loop用arrayA的索引$t1判断循环终止,而实际应该判断arrayB的索引$t2是否小于其长度,否则会出现循环逻辑混乱。

修复后的代码示例

假设arrayB的基地址已传入寄存器$a1,arrayB的长度存在$a2中,修复后的Next段代码如下:

Next:
    sll $t6, $t2, 2      # $t6 = b_idx * 4(计算字节偏移)
    add $t6, $a1, $t6    # 计算arrayB的实际内存地址:基地址 + 偏移量
    # lw $t7, 0($t6)     # 如果不需要读取B[b_idx]的旧值,这行可直接删除
    sw $t0, 0($t6)       # 将tmp_sum存入arrayB[b_idx]
    li $t0, 0            # 重置tmp_sum为0
    addi $t2, $t2, 1     # b_idx自增
    blt $t2, $a2, Loop   # 循环直到b_idx达到arrayB的长度
    jr $ra

额外注意事项

  • 调用这段代码前,要确保arrayB的起始地址已正确加载到$a1(或你指定的寄存器),数组长度加载到$a2;
  • 原代码中的lw $t7, 0($t6)如果没有实际用途,建议直接删除,避免不必要的内存访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:45:05