lla
RISC-V lla 伪指令详解
汇编器伪指令加载本地地址伪指令,按官方汇编手册展开为 PC 相对 AUIPC+ADDI 序列。它适合不需要 GOT 间接寻址的本地符号或非 PIC 地址路径。
你写下的是
lla rd, symbol
常见真实展开
.Llla:
auipc rd, %pcrel_hi(symbol)
addi rd, rd, %pcrel_lo(.Llla)
这条伪指令到底在帮你省什么
明确表达“本地地址、无需 GOT”的寻址意图,是 la 在 nopic/本地路径下的具体形式。
lla 的核心作用是“加载本地符号地址”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。
官方语义核对重点
官方汇编手册把 lla 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 AUIPC 等展开指令的 ISA 定义为准;本页不把 lla 当作独立硬件 opcode。
地址加载中的 %pcrel_hi/%pcrel_lo 或 %got_pcrel_hi 重定位必须按官方汇编手册和 psABI 的配对规则理解。
工具链与链接器边界
lla 表达本地地址加载意图,通常使用 PC 相对重定位;最终 AUIPC/ADDI 序列可能被链接器松弛。
低 12 位重定位必须与对应 AUIPC 标签配对,手写展开时不要跨标签混用。
展开过程怎么理解
步骤 1
AUIPC 以 .Llla 处的 PC 为基准,生成本地符号地址的高位 PC 相对部分。
步骤 2
ADDI 使用匹配 .Llla 的低 12 位重定位补齐本地符号地址。
在 objdump / 反汇编里可能看到什么
AUIPC+ADDI 可能显示为 lla 或 la;链接器松弛后也可能变成更短序列。
官方依据与阅读顺序
本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。
什么时候优先想到它
加载同一链接单元内的标签地址
获取本地静态对象、字符串或跳转表地址
手写非 PIC 汇编并希望避免 GOT 间接加载
解释 la 在 nopic 模式下的真实路径
容易混淆 / 常见误区
lla 不适合可预占全局符号的 PIC 访问;这类场景通常需要 lga/GOT 路径
ADDI 的低位重定位必须匹配前面的 AUIPC 标签
它仍是伪指令,最终机器码以 AUIPC/ADDI 或链接器松弛结果为准
常见问题
lla 是真实 RISC-V 指令吗?
lla 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。
使用 lla 时最容易误解什么?
lla 不适合可预占全局符号的 PIC 访问;这类场景通常需要 lga/GOT 路径