我的问题是我应该如何绕过la
和li
等伪指令的使用。许多互联网资源无论如何只使用伪指令,这在某种程度上让我感到困惑。
我的部分问题在于此代码段出了什么问题。模拟器用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
我不应该为liu
或ori
使用标签m1吗?如果我不打算,我该怎么做呢?
我已经阅读了this并且我理解应该发生什么,但我仍然不确定为什么我的说明会产生不同的效果,以及为什么会有andi $a0,$a0,0x0000ffff
在liu
和ori
命令之前。
我正在使用的MIPS模拟器是QtSpim,如果这是相关的。 我在这里和其他地方一直在寻找这个问题的答案,而我却无法理解它们。 任何帮助/更正都会很精彩。
答案 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)