【问题标题】:Having trouble understanding lbu instruction [duplicate]无法理解 lbu 指令[重复]
【发布时间】:2021-09-08 21:03:23
【问题描述】:

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

"lbu $t1,-100($t2)"

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

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

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

【问题讨论】:

    标签: mips


    【解决方案1】:

    "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,即数据段第二个字节的内容。

    【讨论】:

    • 感谢您提供的非常清晰的示例。还有一件事,.byte 0x20 没有标签,而您通过-1 来访问它,这是因为数据字节是一个接一个的,所以它真的不需要标签吗?
    • 是的,.byte 指令将它们按顺序存储在内存中。标签的使用只是为了让汇编器知道哪个地址对应于该位置,但不需要(例如在所示示例中)
    【解决方案2】:

    我在这里找到了 MIPS 程序集参考:

    https://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf

    它说($t2) 是寄存器$t2 中保存的地址(寄存器集$8$15 之一),-100 表示减去100 并将其用作实际地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2014-03-23
      • 1970-01-01
      • 2020-03-21
      • 2017-11-23
      • 2022-01-04
      相关资源
      最近更新 更多