RARS字符串操作出现地址越界运行时异常求助
问题排查与修复
核心错误原因
触发地址越界的直接原因是错误地将字符的ASCII值当作内存地址使用:
lb s1, (t1)是把寄存器t1指向的内存中的字符(ASCII数值)加载到s1,此时s1存储的是字符的编码(比如'l'的108),而非内存地址。- 后续
sb t5, 0(s1)试图以s1的值作为内存地址写入数据,108这个地址通常不在程序的合法访问范围内,直接触发地址越界异常。
额外潜在问题
- 寄存器
t2、t3未初始化,用来判断\r和\n的逻辑完全失效; - 字符串终止判断
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
相关产品推荐
相关产品推荐

