MIPS“la”伪指令

时间:2016-08-13 23:02:18

标签: mips

有人可以向我解释为什么MARS将伪指令翻译成两条指令:lui& ORI?有翻译只涉及一条指令的情况吗?

2 个答案:

答案 0 :(得分:3)

您可能知道每种类型的命令都有一个“类似”结构命令的结构如下:enter image description here

为该值保存的大小实际上是他们将其拆分为两个不同命令的问题/原因。

您可以在图中看到值的最大类型(I-Type,最低的类型)只有26位。地址具有32位值,因为您知道32位值不能适合26位命令。因此他们将其分为两步:

  • 第一步:使用r-type命令(LUI)load upper immediate(图中的第二个结构)将地址加载到寄存器的高16位。它只是将高16位复制到寄存器的高16位。
  • 第二步:使用或指令复制地址的低16位。因此,它只会将地址的下半部分“复制”到寄存器的下半部分。

答案 1 :(得分:2)

这个简单的程序

.data               
msg: .asciiz "This is a string"
.text
   la  $a0, msg    # pseudo-instruction to load the address of the label str

转换为说明

 Address    Code        Basic                     Source

0x00400000  0x3c011001  lui $1,0x00001001     4       la  $a0, msg    # pseudo-instruction to load the address of the label str
0x00400004  0x34240000  ori $4,$1,0x00000000  

它总是这两条指令AFAIK。 lui指令使立即值向左移位16位并存储在寄存器中。低16位是零。

这样,您可以使用32位指令加载32位地址(以mips32为单位)。