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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:37