寄存器指南

RISC-V gp / x3 寄存器:全局指针与不可分配 ABI 约定

gp 是 psABI 中的 global pointer,并被标记为不可分配寄存器。普通过程不应修改 gp;标准 ABI 这样规定,是因为信号处理器等运行环境可能依赖它的值。

psABI:x3 的 ABI 名称是 gp,含义是 Global pointer。
psABI:gp 是不可分配寄存器,不属于普通临时寄存器池。
新手规则:看到 gp 就把它当运行环境保留值,不要借来做计算。
物理编号 x3ABI 名 gp保存责任 N/A
角色
全局指针;不可由普通过程分配或改写。
调用约定
不可由普通过程分配
先记一句
psABI 将 gp 标记为不可分配寄存器。
psABI 规范依据

不可分配寄存器

gp 在 psABI 中标记为不可分配寄存器。普通过程不应修改它,因为信号处理器、运行时或平台约定可能依赖该值。

调用后保持:不适用
RISC-V psABI integer register convention
快速理解与检索要点

gp / x3 是 psABI 标记的不可分配寄存器。普通过程不应修改它;它不是普通 caller-saved 或 callee-saved 寄存器选择。

psABI 将 x3/gp 标记为不可分配。
普通过程不应修改 gp/tp,因为信号处理器等运行环境可能依赖其值。

适合什么时候用

  • - 按 psABI 把它识别为 global pointer,而不是普通临时寄存器。
  • - 阅读反汇编时,看到 gp 要先按平台/运行环境保留值理解。
  • - 如果目标平台把 gp 用于平台专用目的,需要查阅对应平台 ABI 文档。

什么时候不要这样用

  • - 不要在普通过程里修改 gp。
  • - 不要把 gp 当通用寄存器或临时寄存器使用。
  • - 不要假设 gp 的平台含义在所有环境中都相同。

调用前后会发生什么

1

psABI 将 gp 标记为不可分配寄存器。

2

psABI 明确普通过程不应修改 gp,因为信号处理器可能依赖它。

3

它不是 caller-saved 或 callee-saved 的普通选择题,而是不要分配给普通代码使用。

阅读 gp 时先按保留值理解

示例用于理解规则,不替代完整程序
# 不要在普通函数中借用 gp
# 如果平台 ABI 指定了 gp 用途,按平台 ABI 处理
# 临时计算请使用 t0-t6 或按调用约定保存其他寄存器

常见问题

gp / x3 可以当普通临时寄存器吗?

不应该。psABI 将它标记为不可分配,普通过程不应修改。

gp 的保存责任是 caller 还是 callee?

都不是普通意义上的 caller/callee 选择;它是不可分配寄存器,普通代码不应借用。