li

RISC-V li 伪指令详解

汇编器伪指令

加载整数立即数伪指令。汇编器根据常量大小、XLEN 和可用扩展选择一条或多条真实指令;小的有符号 12 位值可用 ADDI,大常量通常需要 LUI/ADDI 或更多步骤。

你写下的是
li rd, immediate
常见真实展开
addi rd, x0, imm # or: assembler-selected multi-instruction sequence such as LUI/ADDI/ADDIW/SLLI as needed

这条伪指令到底在帮你省什么

单条指令最多编码 12 位立即数(ADDI)或 20 位(LUI),li 自动选择最优序列构建任意 32/64 位常量,是最常用的伪指令之一。

li 的核心作用是“加载立即数到寄存器”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。

官方语义核对重点

官方汇编手册把 li 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 ADDI 等展开指令的 ISA 定义为准;本页不把 li 当作独立硬件 opcode。

工具链与链接器边界

官方汇编手册定义 li 的汇编层意图;实际指令序列由汇编器按常量值、XLEN 和可用扩展选择。
不要把页面中的第一条展开当成唯一机器码;反汇编可能显示 li,也可能显示 LUI/ADDI/ADDIW/SLLI 等真实序列。

展开过程怎么理解

步骤 1
小立即数(-2048~2047):ADDI rd, x0, imm —— 单指令完成。
步骤 2
中立即数(RV32 20位内):LUI rd, imm[31:12] 加载高 20 位;ADDI rd, rd, imm[11:0] 补充低 12 位。
步骤 3
大立即数(RV64):可能需要 ADDIW + SLLI 移位后再 ADDI,构造完整 64 位值。

在 objdump / 反汇编里可能看到什么

反汇编器将 LUI+ADDI 等组合显示为 li rd,imm。小常量仅一条 ADDI,大常量可能是 LUI+ADDI 两条。

官方依据与阅读顺序

本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。

什么时候优先想到它

初始化寄存器为已知常量(计数器初值、基址偏移)
设置系统调用号(li a7, syscall_num)
构建位掩码、魔数、标志位
加载内存映射 I/O 基址

容易混淆 / 常见误区

li 不是单一固定编码;不同常量、XLEN 和扩展组合会生成不同序列
不要手工假设所有 li 都只占一条指令,尤其是 RV64 大常量
12 位 ADDI 立即数是有符号数;大常量拆分时低 12 位进位由汇编器处理
反汇编可能显示 li,也可能显示真实的 LUI/ADDI/移位序列

常见问题

li 是真实 RISC-V 指令吗?

li 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。

使用 li 时最容易误解什么?

li 不是单一固定编码;不同常量、XLEN 和扩展组合会生成不同序列