如何将立即数加载到 RV32I 基本指令集中的寄存器?

Bet*_*tty 7 assembly riscv immediate-operand

最近,我正在研究RV32I基本指令集,我没有发现任何类似于LD r1,imm的指令。因此,我想知道汇编程序员如何将立即数加载到 RV32I 系统中的寄存器中?谢谢。

为此,程序员可以使用 ADDI r1、r0、imm。由于r0是常数0,所以该指令将imm移至寄存器r1。

不知道RV32的设计者是不是这样想的,用ADDI来代替LD r1,imm?

希望任何人都可以对此有所了解。谢谢。

Fee*_*rns 8

还有一个li(立即加载)别名或伪指令也提供您所引用的功能。

以下示例显示了用于加载立即值的 li 伪指令:

.equ  CONSTANT, 0xdeadbeef

li    a0, CONSTANT
Run Code Online (Sandbox Code Playgroud)

对于 RV32I,生成以下汇编器输出,如 objdump 所示:

00000000 <.text>:
   0: deadc537            lui a0,0xdeadc
   4: eef50513            addi    a0,a0,-273 # deadbeef <CONSTANT+0x0>
Run Code Online (Sandbox Code Playgroud)

该片段来自 github markdown,在 riscv 汇编中编程时这是一个很好的参考。 https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md#load-immediate

  • 什么样的疯狂汇编器会发出 4 条指令来在 RV32 上实现 32 位常量?`clang -c -target riscv32 foo.s` 将其组装为 `37 c5 fe ca lui a0, 831468`(使用所有立即数 20 位,不将其中大部分保留为零)和 `addi a0, a0, -1346` 与最后的说明在这里。您在 github 上链接的手册已被修复,显示它组装成 2 条指令,所以我猜 RV32I 不会对 LUI 允许的立即数施加任何额外的限制。我想我会更新你的答案。 (2认同)