【问题标题】:In MIPS/SPIM, whats the difference between li and lw?在 MIPS/SPIM 中,li 和 lw 有什么区别?
【发布时间】:2014-11-17 23:59:07
【问题描述】:

在意识到我对汇编语言和使用 MIPS 有多么迷茫之后,我决定从基础开始,真正理解它。

显然 MIPS 代码有特定用途,但很多东西似乎做类似的事情,我很难理解其中的一些差异。

立即加载.. (li) 和加载单词.. (lw) 有什么区别?我什至不确定“词”是什么。或以下内容:

li $t0,y
lw $t0,0($t0)

它是否将 y 加载到第一行的寄存器 $t0 中?然后将 0($t0) 加载为 y?

对不起,这可能是一个非常愚蠢的问题。如果有人能解释这两行在做什么以及 li/lw 之间的区别,我将不胜感激。谢谢!

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    word 是固定长度的位序列。
    在 MIPS32 上,word 是 32 位宽。
    指令 lw $regA, offset($regB) 从@987654324 指定的内存位置加载一个字@ 写入寄存器 regA

    相比之下,li reg, immediate 不是真正的指令。没有 MIPS cpu 可以执行li。它是一个伪指令,被汇编器转换成两个指令的序列:

    lui $reg, [most significant 16 bits of immediate]
    ori $regA, $regA, [least significant 16 bits of immediate]
    

    lui 用指令中的立即数加载 32 位寄存器的高 16 位,将低 16 位设置为零。
    ori 获取 $regA 的内容,按位执行与指令的 16 位立即数进行逻辑或,并将结果存储回$regA

    所以,总结一下:li $reg, immediate总是same 立即放入寄存器,而 lw $regA, offset($regB) 将加载 current 值内存位置offset($regB)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2021-10-31
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多