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

MIPS字符串遍历逐字符打印功能异常:现有代码错误排查

你的MIPS代码存在的问题分析

下面是代码里的核心问题,按优先级排序:

  • 初始遍历指针完全错误:你把$t1初始化为数值1,但$t1应该指向输入字符串的起始地址(也就是$t0里存的buffer地址)。li $t1,1会让$t1存储无效的内存地址,导致后续加载字符时读取错误区域,直接引发程序异常。正确的初始化应该是move $t1, $t0。

  • 单个字符打印的系统调用缺失:遍历字符时,你加载了字符到$a0,但没有设置对应的打印系统调用(单个字符需要li $v0, 11),所以根本不会输出任何单个字符。

  • 终止条件判断逻辑错误:你用beqz $t1, end判断寄存器$t1是否为0,但需求是遇到字符'0'就结束程序。正确的判断应该是检查加载到$a0的字符是否等于ASCII码48(也就是字符'0'),即beq $a0, 48, end。当前的判断逻辑完全不符合需求,只会在指针变成0时才终止,这几乎不可能发生。

  • 冗余且错误的代码行:la $a0, 256这行是无效的,la指令用于加载标签的地址,而256是数值,不是标签,这行代码没有意义,直接删掉即可。

  • 遍历流程顺序错误:当前loop里的顺序是「加载字符→判断指针→指针加1→循环」,正确的流程应该是「加载字符→判断是否是终止字符→如果不是则打印→指针加1→循环」,否则会漏掉打印最后一个字符,或者在终止时执行不必要的指针递增。

修正后的示例代码

.data 
buffer: .space 256

.text 
main:   
    # 获取输入字符串
    la $a0, buffer
    li $a1, 256
    li $v0, 8
    move $t0, $a0  # 保存buffer起始地址到t0
    syscall
    
    # 打印整个字符串
    move $a0, $t0
    li $v0, 4
    syscall
    
    # 初始化遍历指针为buffer起始地址
    move $t1, $t0

loop:
    lb $a0, ($t1)       # 加载当前字符
    beq $a0, 48, end    # 遇到字符'0'(ASCII 48)就终止
    li $v0, 11          # 设置单个字符打印系统调用
    syscall
    add $t1, $t1, 1     # 指针后移一位
    j loop
    
end: 
    li $v0, 10
    syscall

内容的提问来源于stack exchange,提问作者Grandma Kisses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:35:22