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

MIPS汇编字符串逆序输出缺失首字符问题求助

MIPS汇编逆序输出字符串缺失首元素的问题分析与解决

原因分析

核心问题是指针数组array的空间分配不足:

  • 代码中array: .space 80,每个字符串指针占4字节,最多只能存储20个指针(80÷4=20)。
  • 当输入n=26时,需要存储26个指针,总需求为26×4=104字节,远超80字节的分配额度。
  • 内存越界写入引发未定义行为:第21到26个字符串的指针会被写入到array之后的内存区域(覆盖后续的size变量、string起始地址等)。虽然首元素a的指针存储位置未被直接覆盖,但内存越界破坏了程序的内存布局,导致模拟器无法正确读取该指针,最终缺失输出。

解决思路

1. 增大指针数组的静态空间

根据预期的最大输入n值,分配足够的内存空间。比如要支持n=100,修改array的空间定义:

array:  .space  400  # 100×4字节,可容纳100个指针

2. 添加输入合法性检查

读取n后,判断其是否超过数组的最大容量,避免内存越界:

# 在读取n的代码后添加
lw  $t3, size       # 读取预设的最大容量20
bgt $s0, $t3, input_error  # 若n>20,跳转到错误处理

# 错误处理分支
input_error:
    li  $v0, 4
    la  $a0, "Error: n exceeds maximum allowed value!"
    syscall
    li  $v0, 10
    syscall

3. 可选优化(解决换行符问题)

syscall 8读取字符串时会包含用户输入的换行符,若需输出无多余换行,可在读取后替换换行符为null字符:

# 读取字符串后插入以下代码
move    $t3, $a0      # $t3指向当前字符串的起始地址
replace_newline:
    lb      $t4, ($t3)
    beq     $t4, '\n', do_replace
    beq     $t4, $zero, end_replace
    addi    $t3, $t3, 1
    j       replace_newline
do_replace:
    sb      $zero, ($t3)
end_replace:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:10:34