【问题标题】:MIPS getting around using pseudo-instructions, What is going wrong?MIPS 使用伪指令四处走动,出了什么问题?
【发布时间】:2013-05-19 06:31:27
【问题描述】:

我的问题是我应该如何避免使用伪指令,例如 lali。无论如何,许多互联网资源只是使用伪指令,这在某种程度上让我感到困惑。 我的部分问题是这个 sn-p 出了什么问题。模拟器使用 liu 指令吐出语法错误,我不明白出了什么问题。

据我了解,liu 命令获取有效位,左移 16 位,然后将其放入寄存器 ($a0)。 ori 指令获取标签,并对低 16 位执行 OR,这实际上将其添加到寄存器中。

       .data
m1:    .asciiz "Some string"

       .text
main:   
       lui     $a0, m1        # loads m1 into $a0 to be printed
       ori     $a0, $a0, m1

我不应该为liuori 使用标签m1 吗?如果我不想这样做,我该怎么办?

我已经阅读了this 并且我理解应该发生的事情,但我仍然不确定为什么我的指令有不同的效果,以及为什么在@987654331 之前有一个andi $a0,$a0,0x0000ffff @ 和 ori 命令。

如果相关的话,我使用的 MIPS 模拟器是 QtSpim。 我已经在这里和其他地方寻找这个问题的答案,但我无法理解它们。 任何帮助/更正都会很棒。

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    不幸的是,参考答案中的代码不正确。 应该是:

    lui $a0, m1 >> 16
    ori $a0, $a0, m1 & 0xffff
    

    唯一的问题是 SPIM 似乎不支持标签上的这些运算符。

    无论如何,逻辑是您必须将 32 位地址分成两半,并分别加载它们。右移 16 位为您提供前 16 位(在运行时,lui 将反转移位),而使用0xffff 进行屏蔽则为您提供低 16 位。

    GNU 汇编器有特殊的支持函数%hi%lo 来获得高半和低半。使用它们,您可以编写如下等效代码:

    lui     $a0, %hi(m1)       # loads m1 into $a0 to be printed
    ori     $a0, $a0, %lo(m1)
    

    【讨论】:

    • 感谢您的帮助!您已经弄清楚出了什么问题并以简单的方式解释了逻辑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2021-09-23
    相关资源
    最近更新 更多