li伪

li

伪
RISC-V 汇编 参考

lyszt.net 更详细地介绍了 li 和其他 RISC-V 指令。

描述

li 将一个常量加载到寄存器中。这个名字代表 load immediate(立即加载),而 immediate 是直接写在代码中的固定值。下一行将 42 存入 t0。

li t0, 42

大多数程序一开始都会把已知的数字放入寄存器,包括计数器、限制值和服务代码。

load 一词源于硬件限制。一条 RISC-V 指令长 32 位,必须同时携带操作、寄存器和常量。一条指令无法容纳完整的 32 位常量。小常量能放下,大常量则不能。

li 绕过了这一限制。它是一条伪指令,是汇编器会用该值所需的实际指令替换的名称。小值只需要一条指令。大值需要两条,一条设置高位部分,一条加上低位部分,因此下一行对任意大小的数字都有效。

li t1, 0x10010000

模拟器会显示 li 展开成的实际指令。

RISC-V 手册将 lui 描述为用于构建 32 位常量的指令。它将一个 20 位的值放入目标寄存器的高位,并将最低的 12 位填零。

li 和 la 加载的内容不同。li 加载你输入的数字,la 加载标签所代表的地址。该示例加载了一个小值和一个大值,汇编器对两者的处理方式相同。

展开为

addi rd, zero, imm          # small constants
lui rd, hi  +  addi rd, rd, lo   # large constants

汇编器会将此伪指令替换为上面列出的真实指令或指令。

示例

li t0, 42
li t1, 0x10010000