MIPS实现直角三角形打印问题求助:无法换行且仅输出两颗星
你的MIPS星号打印代码问题排查与修复
嘿,我帮你梳理下这段代码里的几个关键bug,这就是为啥不管输入啥都只出两颗星、换行逻辑完全没生效的原因:
1. 外层循环的行数自增时机完全错了
你刚进入outer循环就立刻给t1(行数)加1,这导致初始的行数1直接变成2,相当于第一次循环就从第2行开始处理。而且后面的跳转逻辑有问题,外层循环根本没机会跑第二次,自然打不出更多行。
2. 内层循环的终止逻辑直接结束程序
你的inner循环用bgt $t2,$t1,done判断终止,但done是整个程序的结束标签——这意味着内层循环跑完一次就直接退出了,根本没机会回到外层循环处理换行或者下一行的打印。
3. 换行触发的条件永远不可能满足
你想用beq $t2,$t3,outer来触发换行,但t2是列数(先自增再打印),t3是星号计数(打印后才自增),这俩变量永远差1,比如t2=2时t3=1,t2=3时t3=2,永远不会相等,这个跳转永远不会触发,自然也不会有换行。
修复后的完整代码
# 假设$t0已经存储了用户输入的目标行数 .data Star: .asciiz "*" Newline: .asciiz "\n" .text li $t1, 1 # 初始化当前行数为1 outer: bgt $t1, $t0, done # 如果当前行数超过输入值,结束程序 li $t2, 1 # 每开新行,重置列数为1 inner: bgt $t2, $t1, newline # 列数超过当前行数时,跳去换行 # 打印单个星号 la $a0, Star li $v0, 4 syscall addi $t2, $t2, 1 # 列数自增 j inner newline: # 打印换行符 la $a0, Newline li $v0, 4 syscall addi $t1, $t1, 1 # 行数自增,进入下一行 j outer done: li $v0, 10 # 程序退出 syscall
修复要点解释
- 调整行数自增时机:把行数加1的操作放到换行之后,确保一行的星号全打完再处理下一行。
- 重置列数:每次进入外层循环(新行)都把
t2重置为1,保证每行从第一列开始打印。 - 修正内层循环的终止跳转:内层循环结束后跳去换行逻辑,而不是直接结束程序,这样才能继续处理后续行。
- 明确的换行逻辑:专门加了
newline标签处理换行,确保每行打印完成后输出换行符,实现换行效果。
比如输入3的话,程序会输出:
**
内容的提问来源于stack exchange,提问作者Handsocks
相关产品推荐
相关产品推荐

