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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:37:26