如何在MIPS实现的二重求和代码中移除内层循环的+1运算
问题分析
原代码中addi $t2, $t2, 1就是对应求和式里的+1运算,执行逻辑如下:
- $t0 存储外层循环的a计数器,取值1~3
- $t1 存储内层循环的b计数器,取值1~3
- 先通过
add $t2, $t1, $t0计算得到a+b的结果 - 再通过addi指令给结果加1,得到单轮循环的项值,再累加到累加寄存器$t3中
修改方案
方案1:等价数学变换预加总偏移
原二重循环共有3*3=9项,每项都加1的总偏移为9,无需修改循环逻辑,修改两处即可:
- 移除
addi $t2, $t2, 1这行代码 - 累加器$t3初始化时赋值为9(或在输出结果前给$t3加9)
注意:原代码没有显式初始化$t3,建议补充li $t3, 0或对应初始值,避免寄存器初始垃圾值干扰结果
方案2:调整循环取值范围消去+1运算
利用式子等价变换a + b +1 = a + (b+1),将内层b的取值整体+1,从原13调整为24,直接用a+b的结果就等于原项值,修改步骤:
- 移除
addi $t2, $t2, 1这行代码 - 主函数中内层计数器初始化语句
li $t1, 1改为li $t1, 2 - 内层循环跳出判断
beq $t1, 4, loopa改为beq $t1, 5, loopa - 外层循环重置内层计数器的语句
li $t1, 1改为li $t1, 2
修改后的完整代码如下:
.text .globl main main: li $t0,1 li $t1,2 li $t3,0 loopb: beq $t1, 5, loopa add $t2, $t1, $t0 add $t3, $t3, $t2 addi $t1, $t1, 1 j loopb loopa: addi $t0, $t0, 1 beq $t0, 4, end li $t1, 2 j loopb end: move $a0, $t3 li $v0, 1 syscall li $v0, 10 syscall
两种方案的运行结果均为45,和原代码完全一致。
内容的提问来源于stack exchange,提问作者Robot123
相关产品推荐
相关产品推荐

