基于ARM AAPCS标准,子程序返回值应存R0还是R2?
ARM AAPCS标准下的返回值寄存器规范
根据ARM AAPCS(ARM Architecture Procedure Call Standard)的明确规定,32位整数、指针类型的返回值必须存入R0寄存器,将返回值放在R2是不符合调用约定的。
具体规则说明
- 对于32位基本数据类型(如int、char、指针等),返回值统一通过R0传递;
- 若返回64位数据(如long long),则使用R0+R1组合传递;
- 更大的复合类型(如结构体)才会通过栈传递返回值。
为什么当前功能正常?
你现在的代码能正常运行,大概率是因为当前编译环境没有触发寄存器冲突场景,或者调用方的C代码编译时恰好没有复用R2寄存器内容。但这种情况不可靠——一旦修改编译选项、调整调用逻辑或更换编译器版本,就可能出现返回值错误、程序崩溃等难以排查的问题。
正确实现示例
符合AAPCS标准的ARM汇编子程序(以两数相加为例):
; 输入:R0 = 第一个参数,R1 = 第二个参数 ; 输出:R0 = 两数之和 add_two_numbers ADD R0, R0, R1 ; 计算结果存入R0 BX LR ; 返回至调用方
对应的C声明:
extern int add_two_numbers(int num1, int num2);
遵守AAPCS规范是保证ARM汇编与C代码交互兼容性、可移植性的核心,建议立即调整返回值存储位置到R0,避免后续潜在风险。
内容的提问来源于stack exchange,提问作者Ghazal
相关产品推荐
相关产品推荐

