MIPS四处使用伪指令,出了什么问题?

时间:2013-05-19 06:31:27

标签: assembly mips

我的问题是我应该如何绕过lali等伪指令的使用。许多互联网资源无论如何只使用伪指令,这在某种程度上让我感到困惑。 我的部分问题在于此代码段出了什么问题。模拟器用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并且我理解应该发生什么,但我仍然不确定为什么我的说明会产生不同的效果,以及为什么会有andi $a0,$a0,0x0000ffffliuori命令之前。

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

1 个答案:

答案 0 :(得分:3)

不幸的是,引用答案中的代码不正确。 它应该是:

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)