You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:55:53