mips32 - MIPS 基本存储(地址为零?)
问题描述
到目前为止,我已经编写了一个完全不使用数据存储器的汇编程序。现在我正在尝试编写一个超级简单的程序来存储一个值,然后将该值加载到一个不同的寄存器中(并打印一些东西以确保我神志清醒)。
li $t0, 13 # data that I want to store
li $v0, 1
move $a0, $t0
syscall
sw $t0, 0($zero) # error
#lw $t1, 32
#li $v0, 1
#move $a0, $t1
#syscall
我不断收到“地址超出范围”错误。我尝试将偏移量更改为不同的值(4、8、32),甚至尝试将立即数加载到寄存器中,所以我没有使用 $zero 寄存器。
如果我的程序只有数据,我用什么作为基地址?在地址零存储数据值有什么问题?我的教科书/大脑让我相信这绝对没问题..
解决方案
那是因为没有内存映射到地址 0。它很可能在 0x10000000 之后的某个地方,(在 MARS 中通常是 0x10010000),当您查看模拟器的数据段窗口时,您会在其中看到。
所以,如果你想访问数据段开头的一个词,放一个标签
IE:
.data
startofdata: .word 0
并在代码部分:
la $a0, startofdata
sw $t0, 0($a0)
如果您想标记每个位置以使其更具可读性,则 startdata 可以命名为错误
推荐阅读
- spring - 带有 Kotlin 的 Youtube 数据 API:请求缺少有效的 API 密钥
- sql - Bigquery 计算从月初到月底/当前日期的拆分
- css - 通过 CSS 选择性地调整图像大小
- mysql - 带有 Symfony 进程的 mysql 命令
- vue.js - Vue 在路由器文件中访问 Vuex 存储
- amazon-s3 - 直接从 S3 读取预训练的拥抱脸转换器
- angular - 升级到 Angular 12 后,所有材料成分都是“未知元素”
- php - Symfony:在属性路径中给出“?Doctrine\Common\Collections\Collection”,“array”类型的预期参数
- angular - 在 Angular 12 迁移期间获取类型 AgGridModule 没有“emod”属性
- javascript - 关于一行代码的另一个 Javascript 问题