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

MIPS汇编代码运行时异常:地址越界问题求助

问题分析与解决

原代码与错误信息

原代码

.data
string: .ascii  "String"

.text
main:

lb $t0, string
lb $a0, 1($t0)

li $v0, 11
syscall

li $v0, 10
syscall

错误信息

line 8: Runtime exception at 0x00400008: address out of range 0x00000054

问题原因

你混淆了MIPS指令的作用:

  • lb $t0, string 是把string地址存储的第一个字节内容(也就是字符'S'的ASCII码0x53)加载到$t0,而非加载string本身的内存地址。
  • 后续lb $a0, 1($t0) 试图访问内存地址 0x53 + 1 = 0x54,该地址属于系统保留区域,用户程序无访问权限,因此触发地址越界错误。
  • 另外你原本想打印第一个字符,但代码里写的1($t0),即使地址正确,也会输出第二个字符't'。

修正后的代码

如果要打印字符串的第一个字符,有两种简洁写法:

写法一:直接加载第一个字符

.data
string: .ascii  "String"

.text
main:
# 直接从string地址加载第一个字节到$a0
lb $a0, string
# 调用打印字符的系统调用
li $v0, 11
syscall
# 退出程序
li $v0, 10
syscall

写法二:先加载字符串地址再访问

.data
string: .ascii  "String"

.text
main:
# 加载string的内存地址到$t0(用la指令)
la $t0, string
# 加载地址$t0+0处的字节(第一个字符)到$a0
lb $a0, 0($t0)
# 打印字符
li $v0, 11
syscall
# 退出程序
li $v0, 10
syscall

关键知识点

  • la $reg, label:将标签对应的内存地址加载到寄存器,是处理字符串、数组的常用指令。
  • lb $reg, label:从标签指向的内存地址中加载单个字节的内容到寄存器,适用于读取单个字符或字节数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:20:28