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

ARM汇编寄存器作用域及函数调用传参规则相关问题咨询

ARM汇编问题解答

问题1:寄存器作用域、参数传递规则与寄存器同一性

  • 汇编层面没有高级语言的变量作用域概念,所有r0-r15都是CPU的物理寄存器,属于全局硬件资源,值的有效性由对应架构的调用约定约束,你给出的是ARM32位代码,遵循AAPCS(ARM架构过程调用标准)。
  • <_ZN7CamTask7executeEv>是C++的非静态成员函数,隐含第一个参数为CamTask实例的this指针,你提到的81ea: 6078 str r0, [r7, #4]中的r0值确实是上层调用者传递的第一个参数,调用该函数前,上层函数就是把this指针写入物理r0寄存器后再执行跳转,传递前后的r0是同一个物理寄存器,命名完全一致。
  • execute函数中81f6: 4618 mov r0, r3写入的r0,和<_ZN10ImgChannel9pushValueEi>函数开头8170: 6078 str r0, [r7, #4]读取的r0是同一个物理寄存器:按照AAPCS规则,调用子函数时第一个参数通过r0传递,父函数在bl跳转前把ImgChannel实例的this指针写入r0,子函数入口直接读取r0获取参数,属于符合调用约定的传参逻辑。

问题2:子函数对r0的修改是否会同步到调用方

  • 按照AAPCS规则,r0-r3属于调用者保存(caller-saved)的临时寄存器,子函数可以直接修改这些寄存器,无需提前备份;如果调用方需要这些寄存器的值在子函数调用后保持不变,需要调用方在执行bl跳转前自行将寄存器值存入栈中,调用结束后再恢复。
  • 你贴出的pushValue函数确实会修改r0的值:函数内部817c: 4618 mov r0, r3主动改写了r0,后续调用<_ZN7Tasking7Channel4pushEv>的返回值也会写入r0,当pushValue返回execute后,r0的值已经是被修改后的新值,和调用前的旧值不一致。
  • 补充:AAPCS规定32位以内的函数返回值默认通过r0带回给调用方,如果pushValue有非空返回值,r0的修改就是主动传递返回值的正常逻辑。

内容的提问来源于stack exchange,提问作者hany erfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:24:05