mips - 无法理解 lbu 指令
问题描述
我在 MARS 中学习 MIPS,我一直在尝试理解 lbu 指令,我需要一些帮助来解开概念。在“帮助”部分,lbu 定义为:
“lbu $t1,-100($t2)”
“加载无符号字节:将 $t1 设置为来自有效内存字节地址的零扩展 8 位值”
- “-100($t2)”有什么作用?
- 零扩展 8 位值究竟是什么意思?
- 我是否正确理解 lbu 指令从寄存器复制第一个(最右边的)8位并将其插入另一个寄存器?
- 如果是这样,“有效内存字节地址”是否指向原始寄存器(从中复制)?
我找不到任何好的解释。也许我的问题有点复杂,但希望你能明白要点。提前致谢。
解决方案
在“lbu $t1,-100($t2)” $t1
中,$t2
是 32 个 MIPS 寄存器中任何-100
一个的占位符,是 16 位符号扩展立即数的占位符。
$t2
该指令从将第二个寄存器(在示例中)的内容与 16 位有符号立即数相加得到的有效内存地址中读取一个字节,然后将目标寄存器($t1
在示例中)的内容与从读取的字节一起加载内存(在 8 个最低有效位中)并在 24 个最高有效位中填充 0。
例如,您可能在 MARS 中有以下示例代码:
.data
info: .byte 0x10
.byte 0x20
last: .byte 0x30
.text
li $a0, 0xFFFFFFFF
la $t0, info
lbu $a0, 0($t0)
la $t1, last
lbu $a1, -1($t1)
li $v0, 10
syscall # terminate
在执行之前lbu $a0, 0($t0)
$a0
将保存0xFFFFFFFF
并将$t0
保存数据段开始的地址。
执行该指令后,$a0
将保存0x10
数据部分第一个字节的内容。
在执行之前lbu $a1, -1($t1)
$t1
将保存数据部分包含最后(第三个)字节的地址(该地址的内容0x30
在示例中)。另请注意,我-1
在本指令中用作立即数。
执行该指令后,$a1
将保存0x20
数据部分第二个字节的内容。
推荐阅读
- c# - .net core 无法从 g 套件帐户发送电子邮件
- vuex - 如何在 vue 3 中使用 vuex 模块
- python - 使用 FastAPI 和 aiokafka 使用 Kafka 消息
- bash - 迭代最新的 git 标签
- azure-devops - 将我的 Angular 项目从 v9 升级到 10 后如何修改 azure build pipeline yml 文件
- html - 如何将盒子放在其他盒子旁边
- database - 尝试在 SQLite 中实现计算列 (GenCol) 时出现语法错误(“AS”附近:语法错误“)
- java - 如何将数字转换为单词
- postgresql - PostgreSQL 中定义的空闲持久连接数在哪里?
- android - 未找到测试:找不到类:android studio 测试中的“com.example.myapplication.ExampleInstrumentedTest”