li
伪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
