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
相关产品推荐
相关产品推荐

