MIPS新手求助:MARS模拟器中sw指令出现地址越界错误
MARS模拟器
sw指令地址越界错误的排查与解决 错误原因
你遇到的address out of range 0x00000004错误,根源在第10行的sw $10, 4($0):
$0是MIPS的零寄存器,其值永远为0,以此为基地址计算出的内存地址是0 + 4 = 0x00000004。- 这个地址属于MARS模拟器的系统保留内核地址空间,用户态程序没有读写权限,因此触发运行时错误。
- 零寄存器的设计目的是提供固定的0值,从来不会被用作内存访问的基地址。
解决方案
方案1:使用.data段分配可读写静态内存
在代码开头添加.data段定义一个可读写的变量,用来存储数据:
.data storage: .word 0 # 分配4字节内存,初始值为0 .text addi $8, $0, 3 addi $9, $0, 2 add $10, $8, $9 sub $11, $8, $9 ori $12, $8, 4 add $13, $8, $9 beq $10, $13, beq_test add $0, $0, $0 add $0, $0, $0 beq_test: sw $10, storage # 将$10的值写入storage指向的内存 lw $14, storage # 从storage读取值到$14 add $0, $0, $0 add $0, $0, $0 j exit add $0, $0, $0 add $0, $0, $0 exit:
方案2:使用栈空间临时存储
利用栈指针$sp分配临时内存空间,适合临时数据存储:
.text addi $8, $0, 3 addi $9, $0, 2 add $10, $8, $9 sub $11, $8, $9 ori $12, $8, 4 add $13, $8, $9 beq $10, $13, beq_test add $0, $0, $0 add $0, $0, $0 beq_test: addi $sp, $sp, -4 # 栈指针下移4字节,分配临时空间 sw $10, 0($sp) # 将$10的值存入栈中 lw $14, 0($sp) # 从栈中读取值到$14 addi $sp, $sp, 4 # 栈指针上移,释放临时空间 add $0, $0, $0 add $0, $0, $0 j exit add $0, $0, $0 add $0, $0, $0 exit:
补充说明
- MARS中用户程序可安全访问的内存区域包括:
.data静态数据段、栈(由$sp管理)和堆区域,避免直接访问低地址的系统保留空间。 - 你的代码中
beq $10, $13, beq_test必然会触发跳转,因为$10和$13都是$8+$9的计算结果,所以beq_test的代码一定会执行。
内容的提问来源于stack exchange,提问作者Slope Plotnick
相关产品推荐
相关产品推荐

