我正在调试运行 FreeRTOS 的 ARM cortex M4 (STM32F4)。在汇编 FreeRTOS 函数内部vPortSVCHandler
,有一条分支指令
bx r14
使用 GDB,我逐条指令执行,发现 r14 (lr) 包含0xfffffffd
紧接在 bx 指令执行之前的值(不是有效地址)。
出于某种原因,GDB 没有遵循(挂起)的bx
指令si
,但我仍然可以step
通过 openOCD。我发现分支到的函数实际上是地址处的有效函数0x08012abc
。
从 ARM 文档开始bx
,它的参数应该是一个包含要跳转到的地址的寄存器。
显然,我误解了或查看了错误的文档。
我尝试lr
在分支指令之前使用 GDB 进行调整。在分支后不久将其更改为0x0
或0xfffffff7
导致硬故障。
这个分支指令如何在以 值调用时0xfffffffd
导致分支到有效函数在0x08102abc
?