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

ARM汇编printf传参异常:复制r0到r2输出错误的原因

问题原因分析

这完全是ARM汇编函数调用约定的问题,和diffofsums本身无关,核心是没搞懂printf的参数传递规则:

  • ARM标准调用约定(如AAPCS)中,可变参数函数(比如printf)的前4个参数通过寄存器r0、r1、r2、r3依次传递,超过4个才会使用栈。
  • 你的格式字符串"The answer is %d\n\0"只有一个%d占位符,它对应printf的第二个参数,必须放在r1寄存器里。
  • 你当前的操作是把diffofsums的返回值(存在r0)移到r2,再把格式字符串加载到r0。此时printf会去r1读取%d对应的值,而r1里还是main中最初设置的#3,所以输出错误;当你把返回值移到r1时,printf正好读取到正确值,输出自然正常。
额外代码修正

你的diffofsums函数里有冗余代码:最后已经通过pop {r4, r5, pc}完成返回,后面的bx lr永远不会执行,直接删掉即可。

补充说明

如果格式字符串有多个占位符,比如"a=%d, b=%d\n",那么第一个%d对应r1,第二个对应r2,以此类推。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:50:30