基于MIPS16指令的迭代运算程序调试求助
MIPS16程序错误排查与修正
你的需求是遍历1到10的数字,奇数加2、偶数乘4,最终将所有处理结果求和并存入内存。以下是原程序的核心错误及修正方案:
原程序核心错误
- 数字来源逻辑错误:原程序通过
lw $3,1($2)从内存读取待处理数字,但未预先将1-10写入内存,导致处理的是随机垃圾值。无需从内存读入,直接用循环变量生成1-10即可。 - 奇偶判断完全失效:原程序用
addi $1,$1,1后执行beq $1,$0,3,这是判断循环变量是否为0,完全无法区分奇偶。正确的做法是提取数字最低位(奇数最低位为1,偶数为0)。 - 求和遗漏奇数结果:原程序仅在偶数分支执行求和操作,奇数分支跳转后跳过了求和步骤,导致奇数处理后的数值未被计入总和。
- 循环变量与流程混乱:
- 循环初始
$1=0,但需要处理1-10,初始值应设为1; - 奇数分支已执行
addi $1,$1,1,后续又重复执行一次,导致循环变量每次递增2,无法遍历所有数字; - 跳转目标错误,
beq $1,$4,7在循环结束时跳转到addi $1,$1,1会引发死循环。
- 循环初始
修正后的程序
addi $1, $0, 1 # i = 1,初始化第一个待处理数字 addi $4, $0, 11 # 循环终止条件:i >= 11时结束(遍历1-10) add $5, $0, $0 # sum = 0,初始化总和 loop: beq $1, $4, exit # 若i等于11,跳转到结束逻辑 andi $6, $1, 1 # 提取i的最低位,$6=1为奇数,0为偶数 beq $6, $0, even # 偶数分支跳转 # 奇数处理:加2 addi $3, $1, 2 # 奇数i加2,结果存$3 j update_sum # 跳转到求和步骤 even: sll $3, $1, 2 # 偶数乘4(左移2位等价于乘4) update_sum: add $5, $5, $3 # 将处理后的数值加到总和 addi $1, $1, 1 # 循环变量i自增1 j loop # 跳回循环开头 exit: sw $5, 0x10($0) # 将总和存储到内存地址0x10处(可按需修改地址)
修正说明
- 直接用循环变量
$1生成1-10的数字,无需依赖内存初始值; - 用
andi $6,$1,1正确判断奇偶; - 统一求和逻辑,奇数、偶数处理后均进入求和步骤,确保所有结果被计入总和;
- 调整循环初始值与终止条件,保证完整遍历1-10;
- 简化跳转逻辑,让循环结构清晰易读。
内容的提问来源于stack exchange,提问作者ruscanca
相关产品推荐
相关产品推荐

