伪指令与汇编写法工作台

RISC-V 伪指令与汇编写法查询:展开、编码和使用场景

这里按 RISC-V 官方汇编手册组织伪指令、汇编别名和标准编码写法,帮助你先看懂 li、call、ret、fence.tso 等写法,再回到真实指令或编码理解行为、范围和注意事项。

59 条条目59 条可见
先分清层级

伪指令和汇编写法属于汇编器层;性能、异常、扩展依赖和立即数范围要看展开后的真实指令或编码。

再看展开

同一写法可能因 XLEN、PIC/nopic、符号距离、可用扩展或链接器松弛产生不同序列,详情页会标出常见路径。

官方来源

展开表参考 RISC-V Assembly Programmer's Manual;真实指令语义参考 Unprivileged ISA;ABI 和重定位参考 psABI。

按用途

伪指令列表

59 条可见

call

汇编器伪指令

远距离函数调用伪指令,使用 AUIPC+JALR 形成 PC 相对调用序列。相比 JAL 的 ±1 MiB 限制,call 常用于跨模块、共享库或动态链接函数调用,并可由链接器松弛为更短序列。

call伪指令函数调用AUIPCJALR远调用
详情页
你写下
call symbol / call rd, symbol
真实展开
auipc ra, offset[31:12] jalr ra, offset[11:0](ra) # or call rd, symbol: auipc rd, offset[31:12] jalr rd, offset[11:0](rd)

j

汇编器伪指令

无条件跳转伪指令,展开为 jal x0, offset。不保存返回地址,直接修改 PC 实现 ±1 MiB 范围内的控制转移。常用于 goto、无限循环和 switch-case 跳转表。

j伪指令无条件跳转JAL控制流goto
详情页
你写下
j offset
真实展开
jal x0, offset

li

汇编器伪指令

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

li伪指令加载立即数ADDILUI常量
详情页
你写下
li rd, immediate
真实展开
addi rd, x0, imm # or: assembler-selected multi-instruction sequence such as LUI/ADDI/ADDIW/SLLI as needed

mv

汇编器伪指令

寄存器间数据复制伪指令,展开为 addi rd, rs, 0。比直接写 ADDI 更清晰地表达赋值语义。在编译器中频繁用于寄存器分配、函数参数准备和临时值保存。

mv伪指令寄存器复制ADDImove赋值
详情页
你写下
mv rd, rs
真实展开
addi rd, rs, 0

nop

汇编器伪指令

空操作伪指令,展开为 addi x0, x0, 0。不改变任何体系结构状态(除推进 PC 外)。主要用于代码对齐、指令缓存行填充和运行时代码补丁预留空间。

nop伪指令空操作ADDI代码对齐指令填充
详情页
你写下
nop
真实展开
addi x0, x0, 0

ret

汇编器伪指令

函数返回伪指令,展开为 jalr x0, 0(ra)。通过 ra 寄存器间接跳转回调用者。是 RISC-V 函数尾声(epilogue)的标准返回方式。

ret伪指令函数返回JALRra返回
详情页
你写下
ret
真实展开
jalr x0, 0(ra)

la

汇编器伪指令

加载地址伪指令,把符号地址放入寄存器。官方汇编手册规定它会随 .option nopic/pic 改变展开:非 PIC 通常是 AUIPC+ADDI,PIC 通常通过 GOT 间接加载。

la伪指令加载地址符号地址AUIPCADDI
详情页
你写下
la rd, symbol
真实展开
# .option nopic .Lla: auipc rd, %pcrel_hi(symbol) addi rd, rd, %pcrel_lo(.Lla) # .option pic .Lla_got: auipc rd, %got_pcrel_hi(symbol) l{w|d} rd, %pcrel_lo(.Lla_got)(rd)

beqz

汇编器伪指令

等于零则分支伪指令,展开为 beq rs, x0, offset。当寄存器值为零时跳转,常用于空指针检查、循环终止和标志位测试。

beqz伪指令等于零分支BEQ空指针循环退出
详情页
你写下
beqz rs, offset
真实展开
beq rs, x0, offset

bnez

汇编器伪指令

不等于零则分支伪指令,展开为 bne rs, x0, offset。当寄存器值非零时跳转,常用于非空保护检查、循环继续判断和布尔值测试。

bnez伪指令非零分支BNEGuard检查循环继续
详情页
你写下
bnez rs, offset
真实展开
bne rs, x0, offset

jr

汇编器伪指令

寄存器间接跳转伪指令,常见形式展开为 jalr x0, 0(rs)。它不保存返回地址,只根据寄存器给出的目标地址转移控制。

jr伪指令间接跳转JALR跳转表函数指针
详情页
你写下
jr rs / jr offset(rs)
真实展开
jalr x0, 0(rs) # or with offset: jalr x0, offset(rs)

tail

汇编器伪指令

尾调用伪指令,展开为 AUIPC t1 + JALR x0(不保存返回地址)。它用于函数最后一步跳到另一个函数;目标函数返回时直接回到当前函数的调用者。

tail伪指令尾调用TCOAUIPC尾递归
详情页
你写下
tail symbol
真实展开
auipc t1, offset[31:12] jalr x0, offset[11:0](t1) # t2 may replace t1 when Zicfilp is enabled

neg

汇编器伪指令

取负(二进制补码)伪指令,展开为 sub rd, x0, rs。计算 0 - rs 得到 rs 的相反数。常用于符号翻转、绝对值计算前置步骤和减法优化。

neg伪指令取负SUB补码符号翻转
详情页
你写下
neg rd, rs
真实展开
sub rd, x0, rs

not

汇编器伪指令

按位取反(NOT)伪指令,展开为 xori rd, rs, -1。将寄存器 rs 的每一位取反(0变1,1变0)后存入 rd。常用于位掩码生成、位清除和逻辑运算。

not伪指令按位取反XORI位操作反码
详情页
你写下
not rd, rs
真实展开
xori rd, rs, -1

seqz

汇编器伪指令

等于零则置位伪指令,展开为 sltiu rd, rs, 1。若 rs == 0 则 rd = 1,否则 rd = 0。rd = (rs == 0) ? 1 : 0。常用于空指针判断和布尔化。

seqz伪指令等于零SLTIU置位空指针判断
详情页
你写下
seqz rd, rs
真实展开
sltiu rd, rs, 1

snez

汇编器伪指令

不等于零则置位伪指令,展开为 sltu rd, x0, rs。若 rs != 0 则 rd = 1,否则 rd = 0。rd = (rs != 0) ? 1 : 0。等价于无符号比较 rs > 0。

snez伪指令非零置位SLTU布尔化非零判断
详情页
你写下
snez rd, rs
真实展开
sltu rd, x0, rs

lga

汇编器伪指令

加载全局地址伪指令,通过 GOT PC 相对序列取得全局符号地址。官方汇编手册给出的基本形式是 AUIPC 加 RV32 的 LW 或 RV64 的 LD。

lgalga (加载全局地址)加载全局地址伪指令汇编别名全局地址
详情页
你写下
lga rd, symbol
真实展开
.Llga: auipc rd, %got_pcrel_hi(symbol) l{w|d} rd, %pcrel_lo(.Llga)(rd)

lla

汇编器伪指令

加载本地地址伪指令,按官方汇编手册展开为 PC 相对 AUIPC+ADDI 序列。它适合不需要 GOT 间接寻址的本地符号或非 PIC 地址路径。

llalla (加载本地地址)加载本地地址伪指令汇编别名本地地址
详情页
你写下
lla rd, symbol
真实展开
.Llla: auipc rd, %pcrel_hi(symbol) addi rd, rd, %pcrel_lo(.Llla)

sgtz

汇编器伪指令

大于零则置位伪指令,展开为 slt rd, x0, rs。若 rs 按有符号数大于 0,则 rd=1,否则 rd=0。

sgtz伪指令比较有符号正数汇编别名
详情页
你写下
sgtz rd, rs
真实展开
slt rd, x0, rs

sltz

汇编器伪指令

小于零则置位伪指令,展开为 slt rd, rs, x0。若 rs 按有符号数小于 0,则 rd=1,否则 rd=0。

sltz伪指令比较有符号负数汇编别名
详情页
你写下
sltz rd, rs
真实展开
slt rd, rs, x0

csrr

汇编器伪指令

读取 CSR 伪指令,展开为 csrrs rd, csr, x0。它读取指定 CSR 到 rd,并因为 rs1=x0 不请求设置任何 CSR 位。

csrrCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrr rd, csr
真实展开
csrrs rd, csr, x0

csrw

汇编器伪指令

写入 CSR 伪指令,展开为 csrrw x0, csr, rs。它把 rs 写入 CSR,并因 rd=x0 不读取或返回旧 CSR 值。

csrwCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrw csr, rs
真实展开
csrrw x0, csr, rs

csrc

汇编器伪指令

清除 CSR 位伪指令,展开为 csrrc x0, csr, rs。它把 rs 中为 1 的位从 CSR 中原子清除,并不返回旧值。

csrcCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrc csr, rs
真实展开
csrrc x0, csr, rs

csrs

汇编器伪指令

设置 CSR 位伪指令,展开为 csrrs x0, csr, rs。它把 rs 中为 1 的位原子置入 CSR,并不返回旧值。

csrsCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrs csr, rs
真实展开
csrrs x0, csr, rs

csrci

汇编器伪指令

立即数清除 CSR 位伪指令,展开为 csrrci x0, csr, uimm。它按 5 位立即数中为 1 的位清除 CSR,并不返回旧值。

csrciCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrci csr, uimm
真实展开
csrrci x0, csr, uimm

csrsi

汇编器伪指令

立即数设置 CSR 位伪指令,展开为 csrrsi x0, csr, uimm。它按 5 位立即数中为 1 的位设置 CSR,并不返回旧值。

csrsiCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrsi csr, uimm
真实展开
csrrsi x0, csr, uimm

csrwi

汇编器伪指令

立即数写 CSR 伪指令,展开为 csrrwi x0, csr, uimm。它把 5 位无符号立即数写入 CSR,并不返回旧值。

csrwiCSR伪指令控制状态寄存器csrrwcsrrs
详情页
你写下
csrwi csr, uimm
真实展开
csrrwi x0, csr, uimm

bgez

汇编器伪指令

大于等于零则分支伪指令,展开为 bge rs, x0, offset。使用有符号比较判断寄存器是否非负,常见于符号检查、循环边界和错误码判断。

bgez伪指令条件分支分支比较有符号
详情页
你写下
bgez rs, offset
真实展开
bge rs, x0, offset

bgt

汇编器伪指令

有符号大于分支伪指令,展开时交换两个源寄存器并使用 BLT:bgt rs1, rs2, offset 等价于 blt rs2, rs1, offset。

bgt伪指令条件分支分支比较有符号
详情页
你写下
bgt rs1, rs2, offset
真实展开
blt rs2, rs1, offset

bgtu

汇编器伪指令

无符号大于分支伪指令,展开时交换两个源寄存器并使用 BLTU:bgtu rs1, rs2, offset 等价于 bltu rs2, rs1, offset。

bgtu伪指令条件分支分支比较有符号
详情页
你写下
bgtu rs1, rs2, offset
真实展开
bltu rs2, rs1, offset

bgtz

汇编器伪指令

大于零则分支伪指令,展开为 blt x0, rs, offset。它用有符号比较判断 rs 是否严格大于 0。

bgtz伪指令条件分支分支比较有符号
详情页
你写下
bgtz rs, offset
真实展开
blt x0, rs, offset

ble

汇编器伪指令

有符号小于等于分支伪指令,展开时交换源寄存器并使用 BGE:ble rs1, rs2, offset 等价于 bge rs2, rs1, offset。

ble伪指令条件分支分支比较有符号
详情页
你写下
ble rs1, rs2, offset
真实展开
bge rs2, rs1, offset

bleu

汇编器伪指令

无符号小于等于分支伪指令,展开时交换源寄存器并使用 BGEU:bleu rs1, rs2, offset 等价于 bgeu rs2, rs1, offset。

bleu伪指令条件分支分支比较有符号
详情页
你写下
bleu rs1, rs2, offset
真实展开
bgeu rs2, rs1, offset

blez

汇编器伪指令

小于等于零则分支伪指令,展开为 bge x0, rs, offset。它用有符号比较判断 rs 是否不大于 0。

blez伪指令条件分支分支比较有符号
详情页
你写下
blez rs, offset
真实展开
bge x0, rs, offset

bltz

汇编器伪指令

小于零则分支伪指令,展开为 blt rs, x0, offset。它用有符号比较判断寄存器是否为负数。

bltz伪指令条件分支分支比较有符号
详情页
你写下
bltz rs, offset
真实展开
blt rs, x0, offset

frflags

汇编器伪指令

读取 fflags 伪指令,展开为 csrrs rd, fflags, x0。fflags 保存浮点累计异常标志。

frflags浮点CSRfcsrfrmfflags
详情页
你写下
frflags rd
真实展开
csrrs rd, fflags, x0

fsflags

汇编器伪指令

写入 fflags 伪指令,常见读写形式展开为 csrrw rd, fflags, rs;写入 x0 形式不返回旧异常标志。

fsflags浮点CSRfcsrfrmfflags
详情页
你写下
fsflags rd, rs / fsflags rs
真实展开
csrrw rd, fflags, rs # or write-only form: csrrw x0, fflags, rs

frcsr

汇编器伪指令

读取 fcsr 伪指令,展开为 csrrs rd, fcsr, x0。fcsr 汇集浮点舍入模式 frm 和异常标志 fflags。

frcsr浮点CSRfcsrfrmfflags
详情页
你写下
frcsr rd
真实展开
csrrs rd, fcsr, x0

frrm

汇编器伪指令

读取 frm 伪指令,展开为 csrrs rd, frm, x0。frm 保存动态浮点舍入模式编码。

frrm浮点CSRfcsrfrmfflags
详情页
你写下
frrm rd
真实展开
csrrs rd, frm, x0

fscsr

汇编器伪指令

写入 fcsr 伪指令,常见读写形式展开为 csrrw rd, fcsr, rs;写后旧值返回 rd。写入 x0 形式不返回旧值。

fscsr浮点CSRfcsrfrmfflags
详情页
你写下
fscsr rd, rs / fscsr rs
真实展开
csrrw rd, fcsr, rs # or write-only form: csrrw x0, fcsr, rs

fsflagsi

汇编器伪指令

立即数写 fflags 伪指令,展开为 csrrwi rd, fflags, uimm 或写后不返回旧值的 x0 形式。用于直接写浮点异常标志字段。

fsflagsi浮点CSRfcsrfrmfflags
详情页
你写下
fsflagsi rd, uimm / fsflagsi uimm
真实展开
csrrwi rd, fflags, uimm # or write-only form: csrrwi x0, fflags, uimm

fsrm

汇编器伪指令

写入 frm 伪指令,常见读写形式展开为 csrrw rd, frm, rs;写入 x0 形式不返回旧舍入模式。

fsrm浮点CSRfcsrfrmfflags
详情页
你写下
fsrm rd, rs / fsrm rs
真实展开
csrrw rd, frm, rs # or write-only form: csrrw x0, frm, rs

fsrmi

汇编器伪指令

立即数写 frm 伪指令,展开为 csrrwi rd, frm, uimm 或写后不返回旧值的 x0 形式。uimm 是 5 位 CSR 立即数字段。

fsrmi浮点CSRfcsrfrmfflags
详情页
你写下
fsrmi rd, uimm / fsrmi uimm
真实展开
csrrwi rd, frm, uimm # or write-only form: csrrwi x0, frm, uimm

jal

汇编器伪指令

JAL 的省略 rd 写法,展开为 jal ra, offset。它保存返回地址到 ra,用于 ±1 MiB 范围内的近距离直接调用。

jaljal (调用并链接别名)调用并链接别名伪指令汇编别名函数调用
详情页
你写下
jal offset
真实展开
jal ra, offset

jalr

汇编器伪指令

JALR 的省略操作数写法,常见形式默认链接到 ra、偏移为 0。它用于通过寄存器中的目标地址进行间接调用。

jalrjalr (间接调用并链接别名)间接调用并链接别名伪指令汇编别名间接调用
详情页
你写下
jalr rs / jalr offset(rs) / jalr rd, rs
真实展开
jalr ra, 0(rs) # or with offset: jalr ra, offset(rs) # or with explicit rd: jalr rd, 0(rs)

sext-w

汇编器伪指令

RV64 符号扩展字伪指令,展开为 addiw rd, rs, 0。它取 rs 的低 32 位并按 bit31 符号扩展到 XLEN。

sext-wsext.wsext.w (符号扩展字)符号扩展字伪指令汇编别名
详情页
你写下
sext.w rd, rs
真实展开
addiw rd, rs, 0

negw

汇编器伪指令

RV64 字取负伪指令,展开为 subw rd, x0, rs。它只对低 32 位执行二补码取负,并把 32 位结果符号扩展到 XLEN。

negwnegw (32位字取负)32位字取负伪指令汇编别名32位取负
详情页
你写下
negw rd, rs
真实展开
subw rd, x0, rs

rdcycle

汇编器伪指令

读取 cycle 计数器伪指令,展开为 csrrs rd, cycle, x0。它读取处理器周期计数器的低 XLEN 位。

rdcycle计数器CSRcycletimeinstret
详情页
你写下
rdcycle rd
真实展开
csrrs rd, cycle, x0

rdcycleh

汇编器伪指令

读取 cycleh 计数器伪指令,展开为 csrrs rd, cycleh, x0。它在 RV32 上读取 cycle 的高 32 位;RV64 通常不使用 h 后缀形式。

rdcycleh计数器CSRcycletimeinstret
详情页
你写下
rdcycleh rd
真实展开
csrrs rd, cycleh, x0

rdinstret

汇编器伪指令

读取 instret 计数器伪指令,展开为 csrrs rd, instret, x0。它读取已退休指令计数器的低 XLEN 位。

rdinstret计数器CSRcycletimeinstret
详情页
你写下
rdinstret rd
真实展开
csrrs rd, instret, x0

rdinstreth

汇编器伪指令

读取 instreth 计数器伪指令,展开为 csrrs rd, instreth, x0。它在 RV32 上读取 instret 的高 32 位;RV64 通常不使用 h 后缀形式。

rdinstreth计数器CSRcycletimeinstret
详情页
你写下
rdinstreth rd
真实展开
csrrs rd, instreth, x0

rdtime

汇编器伪指令

读取 time 计数器伪指令,展开为 csrrs rd, time, x0。它读取平台提供的实时时间计数器低 XLEN 位。

rdtime计数器CSRcycletimeinstret
详情页
你写下
rdtime rd
真实展开
csrrs rd, time, x0

rdtimeh

汇编器伪指令

读取 timeh 计数器伪指令,展开为 csrrs rd, timeh, x0。它在 RV32 上读取 time 的高 32 位;RV64 通常不使用 h 后缀形式。

rdtimeh计数器CSRcycletimeinstret
详情页
你写下
rdtimeh rd
真实展开
csrrs rd, timeh, x0

zext-b

汇编器伪指令

零扩展字节伪指令,按官方汇编手册可用 andi rd, rs, 255 表达。它保留低 8 位并把高位清零。

zext-bzext.bzext.b (零扩展字节)零扩展字节伪指令汇编别名
详情页
你写下
zext.b rd, rs
真实展开
andi rd, rs, 255

zext-h

汇编器伪指令

零扩展半字伪指令,保留低 16 位并清零高位。无 Zbb 时可用左移再逻辑右移序列;有 Zbb 时可用单指令形式。

zext-hzext.hzext.h (零扩展半字)零扩展半字伪指令汇编别名
详情页
你写下
zext.h rd, rs
真实展开
# Zbb path zext.h rd, rs # or without Zbb: slli rd, rs, XLEN-16 srli rd, rd, XLEN-16

zext-w

汇编器伪指令

RV64 零扩展字伪指令,保留低 32 位并清零高位。无 Zba 时可用 slli/srli 序列;有 Zba 时可用 add.uw。

zext-wzext.wzext.w (零扩展字)零扩展字伪指令汇编别名
详情页
你写下
zext.w rd, rs
真实展开
# RV64+Zba path add.uw rd, rs, x0 # or RV64 without Zba: slli rd, rs, 32 srli rd, rd, 32

pause

汇编器伪指令

PAUSE 暂停提示伪指令,官方汇编手册列为 fence w, 0 的提示写法。它用于自旋等待循环,给实现一个降低资源竞争或功耗的机会。

pausepause (暂停提示)暂停提示伪指令汇编别名暂停
详情页
你写下
pause
真实展开
fence w, 0

sbreak

汇编器伪指令

旧名断点伪指令,展开为 ebreak。它保留早期汇编写法兼容性,现代代码通常直接写 EBREAK。

sbreaksbreak (旧名断点)旧名断点伪指令汇编别名断点
详情页
你写下
sbreak
真实展开
ebreak

scall

汇编器伪指令

旧名系统调用伪指令,展开为 ecall。它保留早期汇编写法兼容性,现代代码通常直接写 ECALL。

scallscall (旧名系统调用)旧名系统调用伪指令汇编别名系统调用
详情页
你写下
scall
真实展开
ecall

fence-tso

FENCE 编码写法

fence.tso 是 TSO 内存屏障写法,编码为 FENCE 的 TSO/fm=1000、pred=rw、succ=rw 形式。它表达 TSO 风格排序约束,不等同于普通文本形式的 fence rw,rw。

fence-tsofence.tsofence.tso (TSO内存屏障)TSO内存屏障伪指令汇编别名
详情页
你写下
fence.tso
编码字段
fence.tso # FENCE encoding: fm=1000, pred=rw, succ=rw