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
相关产品推荐
相关产品推荐

