在尝试阅读或编写汇编语言之前,您需要获取文档。对于您使用的指令集,这是 MIPS 问题(您发布的图像)还是标题文本中记录的 risc-v 问题等?
假设 risc-v 访问 risc-v.org 并点击文档链接,他们已经非常容易找到它。
risc-v 中的 LUI 是这样定义的
33222222222211111111 11
10987654321098765432 10987 6543210
imm[31:12] rd opcode
bits 31:12 of the instruction are the immediate
bits 11:7 of the instruction are the destination register
bits 6:0 of the instruction are the opcode
显然,每条指令都需要一些位供处理器解码以知道它是什么指令,只有一个可以具有模式零,因此大多数操作码中都有非零位。同样,您需要一个目标寄存器,其中值被存储,也被编码在指令中。
LUI(加载上立即数)用于构建 32 位常量并使用 U 型格式。LUI 将 U 立即数放在目标寄存器 rd 的前 20 位,用零填充最低 12 位。
该指令的工作原理非常明显。
我承认 risc-v 文档可以做得更好,找到操作码...0b0110111 或 0x37。
不确定人类如何阅读数字的困惑是什么
0b0110111 = 0x37 = 067 (octal) = 55 (decimal)
这些都描述了相同的值,它们都描述了指令中的相同位模式。
所以这意味着他们可以像其他人一样把它放在指令定义中。
33222222222211111111 11
10987654321098765432 10987 6543210
imm[31:12] rd 0110111
所以知道我们可以例如构造
.word 0x12345137
组装然后拆卸
Disassembly of section .text:
00000000 <.text>:
0: 12345137 lui x2,0x12345
好的,让我们向前尝试:
.word 0x12345137
lui x2,0x12345
组装和拆卸
Disassembly of section .text:
00000000 <.text>:
0: 12345137 lui x2,0x12345
4: 12345137 lui x2,0x12345
所以我们开始了,指令编码解决了。
LUI(加载上立即数)用于构建 32 位常量并使用 U 型格式。LUI 将 U 立即数放在目标寄存器 rd 的前 20 位,用零填充最低 12 位。
所以这很清楚 32 位常数在这种情况下
0x12345000
在这种情况下被存储在寄存器 x2 中。
所有指令的编码和操作都定义了,大部分应该很容易理解。编码非常直接且易于理解。
现在,如果这是一个 MIPS 问题而不是 risc-v 问题,那么在这种情况下它同样容易理解。16 位立即数进入常量的 31:16 位,其中 15:0 位全部为零,并且该常量存储在指令中编码的寄存器中。连同操作码一起,处理器可以知道这是什么指令。