在THUMB模式下对TM4C1233H6PM的Keil进行初始化后,运行以下代码:
1) loop1 2) BL loop2 3) MOV R3, #3 4) loop2 5) PUSH {LR} 6) POP {PC}
第(2)行将我带到loop2并将0x00000381存储到LR,但在第(6)行中将堆栈弹出到PC后,PC中存储了0x00000380,这是第(3)行的正确地址。
为什么PC会取0x00000380,而实际上0x00000381是从堆栈中推入并弹出的?
发布于 2019-10-09 00:46:43
某些ARM Cortex-M处理器既可以执行Thumb2代码,也可以执行原始ARM代码,其中所有指令都是32位。因此,当从子例程返回时,处理器需要知道它返回的是哪种代码。如果返回地址的最低有效位设置为1,则处理器知道它正在返回Thumb2代码。
请注意,实际指令必须是半字对齐的,因此真正的分支目标地址的LSB必须为0。在检查LSB以了解要执行哪种代码之后,处理器在实际获取指令之前将LSB强制设置为0。
https://stackoverflow.com/questions/58289744
复制相似问题