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

如何大幅精简生成右向字符金字塔的MIPS汇编程序?

精简你的MIPS金字塔打印程序

你的暴力实现冗余问题很明显——所有printN函数都是重复逻辑,只是硬编码了不同的字符起始位置和数量。下面是核心优化思路和完整精简代码:

优化核心

  • 用循环替代重复函数:所有行的打印逻辑完全一致,只是起始索引和字符数有规律变化,用循环动态计算即可
  • 移位操作优化计算:字符数是2*行数+1,左移1位(sll指令)等价于乘2,比多次加法更高效;起始索引是10 - 行数,每次循环减1即可

精简后的完整代码

.text
.globl main

main:
    la $t0, str          # 加载字符串基地址到$t0
    li $t4, 0            # 行数计数器,从0到10(共11行)

print_loop:
    # 计算当前行的起始索引:10 - 行数
    sub $t1, $zero, $t4
    add $t1, $t1, 10     # $t1 = 10 - $t4

    # 计算当前行的字符数:2*行数 +1,用移位优化乘法
    sll $t2, $t4, 1      # $t2 = $t4 *2
    addi $t2, $t2, 1     # $t2 = 2*$t4 +1

    li $t3, 0            # 当前行的字符打印计数器
print_char_loop:
    lb $a0, ($t0, $t1)   # 加载当前字符:$t0 + $t1 + $t3
    li $v0, 11
    syscall

    addi $t1, $t1, 1     # 下一个字符索引
    addi $t3, $t3, 1     # 计数器+1
    bne $t3, $t2, print_char_loop  # 没打印完继续

    jal print_endl       # 打印换行

    addi $t4, $t4, 1     # 行数+1
    li $t5, 11
    bne $t4, $t5, print_loop  # 没到11行继续

exit:
    li $v0, 10
    syscall

# 复用原有的换行打印函数
print_endl:
    addi $sp, $sp, -4
    sw $a0, 0($sp)
    li $v0, 4
    la $a0, endl
    syscall
    lw $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

.data
endl: .asciiz "\n"
str: .asciiz "mynameisslimshadyprol"

代码说明

  1. 循环结构:外层循环控制行数(0到10),内层循环打印当前行的所有字符
  2. 移位优化:sll $t2, $t4, 1把行数左移1位,快速得到2*行数,再+1就是当前行的字符数,比加法运算更高效
  3. 动态索引计算:每行起始索引从10开始,每循环一次减1,字符数每次加2,完全替代了原有的硬编码逻辑
  4. 复用函数:保留原有的print_endl函数,避免重复造轮子

这样把原有的近百行冗余代码压缩到了几十行,逻辑清晰且易于维护,同时用移位操作优化了关键计算步骤。

内容的提问来源于stack exchange,提问作者Dionysios Bendur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:57:24