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

MIPS程序添加中位数功能时触发内存未对齐异常求助

问题分析与修复

错误根源

你遇到的取地址未按字边界对齐异常,核心问题出在中位数计算的代码段:

li $t4, 5 # t4 = 5
la $s0, array # s0 points to the beginning of the array
add $s0, $s0, $t4 # s0 points to the middle element of the array

MIPS架构中每个整数占4字节(1个字),数组array的元素地址天然按4字节对齐。要访问第5个元素(索引从0开始),正确偏移量应为5 * 4 = 20字节,但你直接将基地址加了5,导致最终地址为array + 5——这个地址末尾是5,不是4的倍数,违反了lw指令的字对齐要求,直接触发异常。

另外,对于10个元素的偶数长度数组,中位数的正确计算逻辑应该是取中间两个元素的平均值(数组已降序排序,对应索引4和5的元素),你当前只取单个元素,逻辑上也不符合统计学定义。

修复后的中位数代码段

替换原中位数计算部分为以下代码:

# Calculate median
la $s0, array # s0指向数组起始地址
# 取第5个元素(索引4,降序排列后为第5大的数)
lw $t5, 16($s0) # 4*4=16字节偏移
# 取第6个元素(索引5)
lw $t6, 20($s0) #5*4=20字节偏移
# 计算平均值(整数除法)
add $t7, $t5, $t6
li $t8, 2
div $t7, $t8
mflo $t9 # 中位数整数部分
mfhi $t10 # 余数,用于判断是否输出小数部分

# 输出中位数提示文本
li $v0, 4
la $a0, median
syscall

# 输出中位数整数部分
move $a0, $t9
li $v0, 1
syscall

# 若有余数,输出.5
bnez $t10, print_half
j skip_half

print_half:
li $v0,4
la $a0, dot
syscall
li $v0,1
li $a0,5
syscall

skip_half:

核心修正点

  1. 地址对齐修复:使用16($s0)和20($s0)的偏移量写法,确保lw指令访问的地址是4的倍数,符合MIPS的内存访问规则。
  2. 中位数逻辑修正:针对偶数长度数组,取中间两个元素的平均值,输出符合统计学标准的中位数结果。

验证效果

修复后重新运行程序,输入10个整数将不再触发地址对齐异常,同时会输出正确的中位数结果(整数或带.5的小数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:35:29