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:
核心修正点
- 地址对齐修复:使用
16($s0)和20($s0)的偏移量写法,确保lw指令访问的地址是4的倍数,符合MIPS的内存访问规则。 - 中位数逻辑修正:针对偶数长度数组,取中间两个元素的平均值,输出符合统计学标准的中位数结果。
验证效果
修复后重新运行程序,输入10个整数将不再触发地址对齐异常,同时会输出正确的中位数结果(整数或带.5的小数)。
内容的提问来源于stack exchange,提问作者ahmed aljabri
相关产品推荐
相关产品推荐

