如何获取AVR代码的返回值?解析指定AVR汇编代码的2字节返回值
AVR汇编代码返回值分析
先看你给出的汇编代码:
ldi r18, 16 lsl r18 mov r24, r18 mov r25, r1 ret
逐行拆解执行逻辑:
ldi r18, 16:把立即数0x10(十进制16)加载到寄存器r18lsl r18:对r18做逻辑左移,左移一位等价于乘2,所以r18的值变为0x20(十进制32)mov r24, r18:将r18的0x20赋值给r24——按照AVR调用约定,16位返回值的低字节存在r24mov r25, r1:将r1的值赋值给r25——16位返回值的高字节存在r25
这里核心是r1的取值:AVR架构里r1是零寄存器,标准约定要求它始终保持为0(程序启动时会初始化r1为0,绝大多数指令也不会修改它),所以r25的值是0x00。
按规则组合高、低字节(r25在前,r24在后),返回值应为0x0020。
如果这个结果不符合你的预期,排查方向:
- 这段代码执行前,是否有其他代码修改了
r1的值? - 读取返回值时是否搞反了字节顺序(比如误把
r24当高字节、r25当低字节,得到0x2000)? - 测试环境是否有不符合AVR标准调用约定的特殊配置?
内容的提问来源于stack exchange,提问作者coder girl
相关产品推荐
相关产品推荐

