call
汇编器伪指令远距离函数调用伪指令,使用 AUIPC+JALR 形成 PC 相对调用序列。相比 JAL 的 ±1 MiB 限制,call 常用于跨模块、共享库或动态链接函数调用,并可由链接器松弛为更短序列。
这里按 RISC-V 官方汇编手册组织伪指令、汇编别名和标准编码写法,帮助你先看懂 li、call、ret、fence.tso 等写法,再回到真实指令或编码理解行为、范围和注意事项。
伪指令和汇编写法属于汇编器层;性能、异常、扩展依赖和立即数范围要看展开后的真实指令或编码。
同一写法可能因 XLEN、PIC/nopic、符号距离、可用扩展或链接器松弛产生不同序列,详情页会标出常见路径。
展开表参考 RISC-V Assembly Programmer's Manual;真实指令语义参考 Unprivileged ISA;ABI 和重定位参考 psABI。
59 条可见
远距离函数调用伪指令,使用 AUIPC+JALR 形成 PC 相对调用序列。相比 JAL 的 ±1 MiB 限制,call 常用于跨模块、共享库或动态链接函数调用,并可由链接器松弛为更短序列。
无条件跳转伪指令,展开为 jal x0, offset。不保存返回地址,直接修改 PC 实现 ±1 MiB 范围内的控制转移。常用于 goto、无限循环和 switch-case 跳转表。
加载整数立即数伪指令。汇编器根据常量大小、XLEN 和可用扩展选择一条或多条真实指令;小的有符号 12 位值可用 ADDI,大常量通常需要 LUI/ADDI 或更多步骤。
寄存器间数据复制伪指令,展开为 addi rd, rs, 0。比直接写 ADDI 更清晰地表达赋值语义。在编译器中频繁用于寄存器分配、函数参数准备和临时值保存。
空操作伪指令,展开为 addi x0, x0, 0。不改变任何体系结构状态(除推进 PC 外)。主要用于代码对齐、指令缓存行填充和运行时代码补丁预留空间。
函数返回伪指令,展开为 jalr x0, 0(ra)。通过 ra 寄存器间接跳转回调用者。是 RISC-V 函数尾声(epilogue)的标准返回方式。
加载地址伪指令,把符号地址放入寄存器。官方汇编手册规定它会随 .option nopic/pic 改变展开:非 PIC 通常是 AUIPC+ADDI,PIC 通常通过 GOT 间接加载。
等于零则分支伪指令,展开为 beq rs, x0, offset。当寄存器值为零时跳转,常用于空指针检查、循环终止和标志位测试。
不等于零则分支伪指令,展开为 bne rs, x0, offset。当寄存器值非零时跳转,常用于非空保护检查、循环继续判断和布尔值测试。
寄存器间接跳转伪指令,常见形式展开为 jalr x0, 0(rs)。它不保存返回地址,只根据寄存器给出的目标地址转移控制。
尾调用伪指令,展开为 AUIPC t1 + JALR x0(不保存返回地址)。它用于函数最后一步跳到另一个函数;目标函数返回时直接回到当前函数的调用者。
取负(二进制补码)伪指令,展开为 sub rd, x0, rs。计算 0 - rs 得到 rs 的相反数。常用于符号翻转、绝对值计算前置步骤和减法优化。
按位取反(NOT)伪指令,展开为 xori rd, rs, -1。将寄存器 rs 的每一位取反(0变1,1变0)后存入 rd。常用于位掩码生成、位清除和逻辑运算。
等于零则置位伪指令,展开为 sltiu rd, rs, 1。若 rs == 0 则 rd = 1,否则 rd = 0。rd = (rs == 0) ? 1 : 0。常用于空指针判断和布尔化。
不等于零则置位伪指令,展开为 sltu rd, x0, rs。若 rs != 0 则 rd = 1,否则 rd = 0。rd = (rs != 0) ? 1 : 0。等价于无符号比较 rs > 0。
加载全局地址伪指令,通过 GOT PC 相对序列取得全局符号地址。官方汇编手册给出的基本形式是 AUIPC 加 RV32 的 LW 或 RV64 的 LD。
加载本地地址伪指令,按官方汇编手册展开为 PC 相对 AUIPC+ADDI 序列。它适合不需要 GOT 间接寻址的本地符号或非 PIC 地址路径。
大于零则置位伪指令,展开为 slt rd, x0, rs。若 rs 按有符号数大于 0,则 rd=1,否则 rd=0。
小于零则置位伪指令,展开为 slt rd, rs, x0。若 rs 按有符号数小于 0,则 rd=1,否则 rd=0。
读取 CSR 伪指令,展开为 csrrs rd, csr, x0。它读取指定 CSR 到 rd,并因为 rs1=x0 不请求设置任何 CSR 位。
写入 CSR 伪指令,展开为 csrrw x0, csr, rs。它把 rs 写入 CSR,并因 rd=x0 不读取或返回旧 CSR 值。
清除 CSR 位伪指令,展开为 csrrc x0, csr, rs。它把 rs 中为 1 的位从 CSR 中原子清除,并不返回旧值。
设置 CSR 位伪指令,展开为 csrrs x0, csr, rs。它把 rs 中为 1 的位原子置入 CSR,并不返回旧值。
立即数清除 CSR 位伪指令,展开为 csrrci x0, csr, uimm。它按 5 位立即数中为 1 的位清除 CSR,并不返回旧值。
立即数设置 CSR 位伪指令,展开为 csrrsi x0, csr, uimm。它按 5 位立即数中为 1 的位设置 CSR,并不返回旧值。
立即数写 CSR 伪指令,展开为 csrrwi x0, csr, uimm。它把 5 位无符号立即数写入 CSR,并不返回旧值。
大于等于零则分支伪指令,展开为 bge rs, x0, offset。使用有符号比较判断寄存器是否非负,常见于符号检查、循环边界和错误码判断。
有符号大于分支伪指令,展开时交换两个源寄存器并使用 BLT:bgt rs1, rs2, offset 等价于 blt rs2, rs1, offset。
无符号大于分支伪指令,展开时交换两个源寄存器并使用 BLTU:bgtu rs1, rs2, offset 等价于 bltu rs2, rs1, offset。
大于零则分支伪指令,展开为 blt x0, rs, offset。它用有符号比较判断 rs 是否严格大于 0。
有符号小于等于分支伪指令,展开时交换源寄存器并使用 BGE:ble rs1, rs2, offset 等价于 bge rs2, rs1, offset。
无符号小于等于分支伪指令,展开时交换源寄存器并使用 BGEU:bleu rs1, rs2, offset 等价于 bgeu rs2, rs1, offset。
小于等于零则分支伪指令,展开为 bge x0, rs, offset。它用有符号比较判断 rs 是否不大于 0。
小于零则分支伪指令,展开为 blt rs, x0, offset。它用有符号比较判断寄存器是否为负数。
读取 fflags 伪指令,展开为 csrrs rd, fflags, x0。fflags 保存浮点累计异常标志。
写入 fflags 伪指令,常见读写形式展开为 csrrw rd, fflags, rs;写入 x0 形式不返回旧异常标志。
读取 fcsr 伪指令,展开为 csrrs rd, fcsr, x0。fcsr 汇集浮点舍入模式 frm 和异常标志 fflags。
读取 frm 伪指令,展开为 csrrs rd, frm, x0。frm 保存动态浮点舍入模式编码。
写入 fcsr 伪指令,常见读写形式展开为 csrrw rd, fcsr, rs;写后旧值返回 rd。写入 x0 形式不返回旧值。
立即数写 fflags 伪指令,展开为 csrrwi rd, fflags, uimm 或写后不返回旧值的 x0 形式。用于直接写浮点异常标志字段。
写入 frm 伪指令,常见读写形式展开为 csrrw rd, frm, rs;写入 x0 形式不返回旧舍入模式。
立即数写 frm 伪指令,展开为 csrrwi rd, frm, uimm 或写后不返回旧值的 x0 形式。uimm 是 5 位 CSR 立即数字段。
JAL 的省略 rd 写法,展开为 jal ra, offset。它保存返回地址到 ra,用于 ±1 MiB 范围内的近距离直接调用。
JALR 的省略操作数写法,常见形式默认链接到 ra、偏移为 0。它用于通过寄存器中的目标地址进行间接调用。
RV64 符号扩展字伪指令,展开为 addiw rd, rs, 0。它取 rs 的低 32 位并按 bit31 符号扩展到 XLEN。
RV64 字取负伪指令,展开为 subw rd, x0, rs。它只对低 32 位执行二补码取负,并把 32 位结果符号扩展到 XLEN。
读取 cycle 计数器伪指令,展开为 csrrs rd, cycle, x0。它读取处理器周期计数器的低 XLEN 位。
读取 cycleh 计数器伪指令,展开为 csrrs rd, cycleh, x0。它在 RV32 上读取 cycle 的高 32 位;RV64 通常不使用 h 后缀形式。
读取 instret 计数器伪指令,展开为 csrrs rd, instret, x0。它读取已退休指令计数器的低 XLEN 位。
读取 instreth 计数器伪指令,展开为 csrrs rd, instreth, x0。它在 RV32 上读取 instret 的高 32 位;RV64 通常不使用 h 后缀形式。
读取 time 计数器伪指令,展开为 csrrs rd, time, x0。它读取平台提供的实时时间计数器低 XLEN 位。
读取 timeh 计数器伪指令,展开为 csrrs rd, timeh, x0。它在 RV32 上读取 time 的高 32 位;RV64 通常不使用 h 后缀形式。
零扩展字节伪指令,按官方汇编手册可用 andi rd, rs, 255 表达。它保留低 8 位并把高位清零。
零扩展半字伪指令,保留低 16 位并清零高位。无 Zbb 时可用左移再逻辑右移序列;有 Zbb 时可用单指令形式。
RV64 零扩展字伪指令,保留低 32 位并清零高位。无 Zba 时可用 slli/srli 序列;有 Zba 时可用 add.uw。
PAUSE 暂停提示伪指令,官方汇编手册列为 fence w, 0 的提示写法。它用于自旋等待循环,给实现一个降低资源竞争或功耗的机会。
旧名断点伪指令,展开为 ebreak。它保留早期汇编写法兼容性,现代代码通常直接写 EBREAK。
旧名系统调用伪指令,展开为 ecall。它保留早期汇编写法兼容性,现代代码通常直接写 ECALL。
fence.tso 是 TSO 内存屏障写法,编码为 FENCE 的 TSO/fm=1000、pred=rw、succ=rw 形式。它表达 TSO 风格排序约束,不等同于普通文本形式的 fence rw,rw。