ARM处理器中持续执行pop/push栈指令的CPU行为探究
ARM裸机环境下栈指令循环执行的行为分析
持续执行pop {r1}的行为
在32位ARM裸机环境中:
- 每次
pop {r1}会使栈指针sp递增4字节(ARM栈默认向下生长,pop操作从栈顶恢复数据,因此sp向上移动)。 - 当
sp递增至0xFFFFFFFF后,下一次递增会触发32位寄存器溢出回绕,sp变为0x00000000,后续pop指令会从0x00000000地址开始读取数据。 - 裸机环境没有操作系统的内存保护机制,处理器不会抛出任何异常,会持续执行合法的内存读取操作——这就是你的功耗传感器未检测到异常、功耗保持恒定的核心原因:处理器始终在执行正常指令流程,没有触发异常处理的额外开销。
持续执行push {r1}的行为
若循环执行push {r1}:
- 每次
push会使sp递减4字节,同样遵循32位寄存器的溢出规则。 - 当
sp从0x00000000递减时,会回绕到0xFFFFFFFF,后续push会将数据写入该地址及更低的内存区域。 - 同样,裸机环境下无内存保护,处理器会持续执行写入操作,功耗保持稳定;只有当写入地址恰好是外设寄存器等敏感区域时,才可能触发硬件层面的异常,但单纯的内存写入本身不会中断指令流程。
额外说明
你通过.rept 200生成循环指令,再配合末尾的绝对跳转,确保了控制流的稳定性,因此处理器会持续重复栈操作指令,不会因内存访问问题中断执行。
内容的提问来源于stack exchange,提问作者Alessandro Bertulli
相关产品推荐
相关产品推荐

