有人可以解释一下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
答案 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}})从0x1001
和Alength
的地址的高位开始,而从地址的低半部分的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
的更易理解的解释:
lui
将值加载到寄存器的前16位因此lui $t0, 4097
将在$ t0中存储10000000000010000000000000000
等于十进制268500992