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
问题根源
- 过早写入字符串终止符:循环中每次存完字符后,立刻把
$zero写入下一个地址,第一次循环就会把str[1]设为0。而MIPS的syscall 4(打印字符串)会从起始地址开始,遇到第一个0就停止输出,导致最终输出为空。 - 循环逻辑顺序错误:终止符应该在所有字符写入完成后再添加,而不是每次循环都执行。
调试与修复建议
- 单步调试观察内存:用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
相关产品推荐
相关产品推荐

