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

RARS字符串操作出现地址越界运行时异常求助

问题排查与修复

核心错误原因

触发地址越界的直接原因是错误地将字符的ASCII值当作内存地址使用:

  • lb s1, (t1) 是把寄存器t1指向的内存中的字符(ASCII数值)加载到s1,此时s1存储的是字符的编码(比如'l'的108),而非内存地址。
  • 后续sb t5, 0(s1) 试图以s1的值作为内存地址写入数据,108这个地址通常不在程序的合法访问范围内,直接触发地址越界异常。

额外潜在问题

  1. 寄存器t2、t3未初始化,用来判断\r和\n的逻辑完全失效;
  2. 字符串终止判断beq s1, t5, tapos错误——t5初始值是'U',应该用**空字符(ASCII 0)**作为字符串结束标志。

修正后的代码

# asciis for l, U, \r, \n and null
li t4, 108          # 'l'的ASCII码
li t5, 'U'          # 'U'的ASCII码
li t2, '\r'         # 初始化回车符
li t3, '\n'         # 初始化换行符
li t6, 0            # 空字符,用于判断字符串结束

la t1, str1         # t1是指向字符串的指针

repeat:
lb s1, (t1)         # 读取当前指针指向的字符
beq s1, t2, tapos   # 遇到\r跳转到结束
beq s1, t3, tapos   # 遇到\n跳转到结束
beq s1, t6, tapos   # 遇到空字符跳转到结束
beq s1, t4, test_replace  # 遇到'l'则执行替换
j repeat

test_replace:
# 替换当前指针指向的字符为'U',注意基地址是t1(字符串指针)
sb t5, 0(t1)
j repeat

tapos:
# 这里可以添加字符串处理完成后的逻辑
nop

关键修改点

  • 替换操作改为sb t5, 0(t1):用字符串指针t1作为基地址,直接修改它指向的内存位置;
  • 初始化了t2、t3、t6,完善了字符串终止和换行/回车的判断逻辑;
  • 修正了字符串结束的判断条件,改用空字符作为终止标志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:31:35