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
相关产品推荐
相关产品推荐

