MIPS运行时异常求助:计算数组累积和时地址越界错误
问题分析与修复方案
错误根源
报错显示访问了0x00000000空地址,核心问题有两个:
- 未结合数组基地址与偏移量:代码中
sll $t6, $t2, 2仅计算了索引对应的字节偏移(每个int占4字节),但直接用0($t6)作为内存地址,相当于访问以0为起始的非法内存区域——arrayB的实际起始地址不可能是0,必须把数组基地址和偏移量相加得到有效内存地址。 - 循环条件逻辑错误:
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
相关产品推荐
相关产品推荐

