MIPS组装 - lui $ t0,4097?

时间:2011-12-05 01:36:17

标签: assembly mips

有人可以解释一下lui的工作原理,“4097”代表什么,将8添加到$t0是什么意思?

               .data        0x10010000
blank:                .asciiz        " "                                # 4097
newline:        .asciiz        "\n"                                # 4097 + 2

#input_start
Alength:        .word        13
Aarray:         .word        130, 202, 30, 4440, 530, 532, 33, 204, 8, 524, 8933, 92, 10
#input_end

           .text


lui        $t0, 4097
ori        $a0, $t0, 8                        # address of A[]
lw        $a1, 4($t0)                        # load length

4 个答案:

答案 0 :(得分:12)

4097 = 1001 hex

所以,第一条指令将0x10010000放入寄存器t0。 lui是“load upper immediate”,“upper”表示高16位,“immediate”表示你给它一个字面值(4097)。 4097作为“上限”值变为0x10010000。

ori是“或立即”,8是立即值,因此a0中的结果地址是0x10010008,这是Aarray居住的地址。

最后的指令lw是“加载字”,它从t0中的存储器地址加载(此时仍然只是0x10010000)加上4个字节(4是从t0的偏移量,并产生ALength存在的地址)将4个字节的数据转换为a1。

答案 1 :(得分:7)

lui $ t0,4097是加载上方立即指令。立即值(4097)向左移位16位并存储在$ t0寄存器中。低16位是零。

答案 2 :(得分:0)

这是“手动执行”操作以生成静态地址,这是缺少%hi(symbol)%lo(symbol)来使链接器填写4097({{ 1}})从0x1001Alength的地址的高位开始,而从地址的低半部分的4和8开始。

此代码假定MARS会将Aarray部分放在.data处,就像它与0x10010000指令在行上说的那样。

这两个字符串的总和为4个字节,因此字值已经按字对齐。即使最终将其归为零字节,此代码也没有使用.data指令(直到您添加另一个字符串并且字加载中断)。


如果您编译此C on the Godbolt compiler explorer

.align

MIPS gcc5.4 -O3为您提供了这种自动提款机(消除了一些噪音):

int x = 1;               // with no initializer it goes in the .bss as  .space 4
int foo() { return x; }

foo(): lui $2,%hi(x) lw $2,%lo(x)($2) j $31 nop # IDK why it didn't put the load in the branch-delay slot; clang does .data .p2align 2 # actually gcc uses .align 2 but I disambiguated x: .word 1 $2,即标准MIPS调用约定中的返回值。

答案 3 :(得分:0)

只想添加对lui $t0, 4097的更易理解的解释:

  • 十进制4097等于二进制1000000000001
  • lui将值加载到寄存器的前16位

因此lui $t0, 4097将在$ t0中存储10000000000010000000000000000 等于十进制268500992