RISC-V未被调用使用的参数寄存器是否仍属于调用者保存?
结论
是的,只要该函数是不调用其他任何函数的叶子函数,无论它的入参声明是什么样,哪怕是void(void)类型,都可以无需执行任何保存操作,直接自由使用全部8个a0~a7寄存器,这个规则和函数实际用到的参数寄存器数量完全无关。
原因说明
RISC-V ABI中「调用者保存寄存器」的定义核心是:该类寄存器的原值保护义务由发起函数调用的一方承担,被调用的函数天然不需要为这类寄存器的原值负责。
换句话说,上层调用者在调用你的函数之前,就默认a0~a7的值会被你修改,要是调用者后续还要用这些寄存器里的值,它自己会提前存好,不需要被调用的函数操心。
补充注意点
- 只有当你的函数本身需要调用其他函数时,你才需要处理
a0~a7的保存逻辑:这时候你变成了调用方,需要把你后续还要用到的aX寄存器里的值提前压栈保存,等被调用函数返回之后再恢复,避免你自己要用的值被其他函数改掉。 - 注意和被调用者保存寄存器(
s0~s11)做区分:如果你要用到s系列寄存器,不管你是不是叶子函数,都必须先备份寄存器原值,函数返回前再恢复,因为上层调用者默认这类寄存器的值在调用前后不会发生变化。
内容的提问来源于stack exchange,提问作者distributed
相关产品推荐
相关产品推荐

