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

MIPS问题:生成指定长度字节字符字符串失败

MIPS循环生成字符串问题调试分析

你实现的无循环版本可以正常输出iiii,代码如下:

.text
main:
    lb $a1, char
    
    la $a0, str
    
    sb $a1, 0($a0)
    sb $a1, 1($a0)
    sb $a1, 2($a0)  
    sb $a1, 3($a0)
    sb $zero, 4($a0)
                        
    li $v0, 4
    syscall
.data
char: .byte 'i'
str: .space 10

但循环版本输出为空,问题代码:

.text
main:

    lbu $a1, o      # Load 'o' character
    li $t0, 10      # Create counter
    la $a0, str
loop:
    sb $a1, 0($a0)      # Store 'o' at first byte of $a0
    sub $t0, $t0, 1     # Decrement counter
    addi $a0, $a0, 1    # Increment pointer
    sb $zero, 0($a0)    # End string with $zero

    beqz $t0, end       # Branch to end if $t0 = 0
    j loop          # Loop
end:
    li $v0, 4       # Print resulting string
    syscall

.data
o: .byte 'o'
str: .space 11

问题根源

  1. 过早写入字符串终止符:循环中每次存完字符后,立刻把$zero写入下一个地址,第一次循环就会把str[1]设为0。而MIPS的syscall 4(打印字符串)会从起始地址开始,遇到第一个0就停止输出,导致最终输出为空。
  2. 循环逻辑顺序错误:终止符应该在所有字符写入完成后再添加,而不是每次循环都执行。

调试与修复建议

  • 单步调试观察内存:用MARS/SPIM模拟器单步执行,每次循环后查看$a0指向的内存区域,确认每个字节的写入值,就能发现过早写入0的问题。
  • 调整终止符写入时机:把sb $zero, 0($a0)移到循环结束后执行。
  • 修正循环计数逻辑:确保循环执行次数等于要写入的字符数,避免指针越界。

修复后的代码示例:

.text
main:
    lbu $a1, o          # 加载字符'o'
    li $t0, 10          # 要生成的字符数量
    la $t1, str         # 保存字符串起始地址到$t1,避免后续指针移动丢失
    move $a0, $t1       # 初始化指针为字符串起始地址

loop:
    sb $a1, 0($a0)      # 写入当前字符
    sub $t0, $t0, 1     # 计数器减1
    addi $a0, $a0, 1    # 指针后移
    bnez $t0, loop      # 计数器不为0则继续循环

sb $zero, 0($a0)        # 循环结束后添加字符串终止符
la $a0, $t1             # 把$a0重置为字符串起始地址
li $v0, 4
syscall

.data
o: .byte 'o'
str: .space 11          # 预留10个字符+1个终止符的空间

内容的提问来源于stack exchange,提问作者David Shorten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:37:32