首页 > 解决方案 > 无法理解 lbu 指令

问题描述

我在 MARS 中学习 MIPS,我一直在尝试理解 lbu 指令,我需要一些帮助来解开概念。在“帮助”部分,lbu 定义为:

“lbu $t1,-100($t2)”

“加载无符号字节:将 $t1 设置为来自有效内存字节地址的零扩展 8 位值”

  1. “-100($t2)”有什么作用?
  2. 零扩展 8 位值究竟是什么意思?
  3. 我是否正确理解 lbu 指令从寄存器复制第一个(最右边的)8位并将其插入另一个寄存器?
  4. 如果是这样,“有效内存字节地址”是否指向原始寄存器(从中复制)?

我找不到任何好的解释。也许我的问题有点复杂,但希望你能明白要点。提前致谢。

标签: mips

解决方案


“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数据部分第二个字节的内容。


推荐阅读