0

我的问题是关于我应该如何避免使用伪指令,例如laand 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

我不应该将标签 m1 用于liuorori吗?如果我不是故意的,我该怎么做呢?

我已经读过这篇文章并且我理解应该发生什么,但我仍然不确定为什么我的指令有不同的效果,以及为什么在and命令andi $a0,$a0,0x0000ffff之前有一个。liuori

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

4

1 回答 1

4

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

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

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

Anyway, the logic is that you have to split the 32 bit address into 2 halves, and load them separately. Right shifting by 16 gives you the top 16 bits (the shift will be reversed by the lui at runtime) while masking with 0xffff gives you the low 16 bits.

GNU assembler has special support functions %hi and %lo to get the high and low halves. With them you can write equivalent code as follows:

lui     $a0, %hi(m1)       # loads m1 into $a0 to be printed
ori     $a0, $a0, %lo(m1)
于 2013-05-19T13:36:55.830 回答