RISC-V U-Format指令立即混淆

RISC-V U-Format instruction immediate confusion

阅读 RISC-V unprivileged specification 我看到 U 格式指令 (lui,..) 是这样定义的:

但是立即数在这里对我来说没有意义:具体来说,如果给出像 lui t0, 0xABCDE 这样的指令,立即数的低 12 位将(并且应该)在高 20 位中t0。 (即 t0 = 0xABCDE000

imm[31:12] 看起来 0xABCDE 在 汇编期间被左移了 12 位 ,对吗?

The imm[31:12] makes it look like the 0xABCDE is being shifted left by 12 bits during assembly, is that correct?

这20位被编码到指令的imm字段中,是32位指令的高20位中的一个字段。结果是一条机器代码指令,要求处理器将 0xABCDE000 加载到寄存器中。此编码是否涉及将汇编代码中声明的立即数左移 12 位?是的,我同意。

需要明确的是,汇编器采用的形式是语法问题,机器代码采用的形式是编码问题。在这里,我们可以编写一个不同的汇编器,它要求您指定值 0xABCDE000(然后如果低 12 位是 non-zero 则报错)——这样就没有 assemble-time“移位”。


在 RISC V 中,其他指令的立即数以更复杂的方式编码。一个大的立即数被拆分并插入到单独的单独字段中;这样做是为了在每条指令中将寄存器字段保持在同一位置,并将立即数的符号位保持在同一位置,(符号扩展需要动态扩展)。

例如,查看 S-Format,其中 12 位立即数在编码指令中被拆分为两个单独的字段。

另见