call

RISC-V call 伪指令详解

汇编器伪指令

RISC-V Assembly Programmer's Manual 第 26 章将 call symbol 和 call rd, symbol 列为用于调用远距离子程序的汇编器伪指令。call symbol 默认使用 ra 作为链接寄存器保存返回地址;call rd, symbol 则使用指定的 rd 作为链接寄存器保存返回地址。psABI 将 CALL 伪指令生成的 AUIPC+JALR 指令对与 R_RISCV_CALL 或 R_RISCV_CALL_PLT 重定位关联。

你写下的是
call symbol call rd, symbol
常见真实展开
auipc ra, 0 jalr ra, ra, 0

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

RISC-V Assembly Programmer's Manual 第 26 章将 call 定义为调用远距离子程序的汇编器写法:默认形式隐式使用 ra 作为链接寄存器,显式形式使用指定的 rd 保存返回地址。

展开过程怎么理解

步骤 1
psABI 的 call symbol 示例先执行 auipc ra, 0,并带有 R_RISCV_CALL 重定位。
步骤 2
示例随后执行 jalr ra, ra, 0;RISC-V Assembly Programmer's Manual 第 26 章说明 call symbol 隐式使用 ra 保存返回地址,而 call rd, symbol 使用 rd。

官方依据与阅读顺序

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

容易混淆 / 常见误区

psABI 已将 R_RISCV_CALL 标为 deprecated,并建议使用 R_RISCV_CALL_PLT;只有启用链接器松弛时,AUIPC 指令才另带 R_RISCV_RELAX 重定位。

常见问题

call 是独立硬件 opcode 吗?

不是。RISC-V Assembly Programmer's Manual 第 26 章将 call 列为伪指令;psABI 说明其生成 AUIPC+JALR 指令对。