Jeg debugger en ARM cortex M4 (STM32F4), der kører FreeRTOS. Inde i forsamlingen FreeRTOS-funktion vPortSVCHandler
er der en filialinstruktion
bx r14
ved hjælp af GDB går jeg igennem instruktion ved instruktion og finder ud af, at r14 (lr) indeholder værdien 0xfffffffd
(ikke en gyldig adresse) umiddelbart før bx-instruktionen udføres.
Af en eller anden grund følger GDB ikke instruktionen bx
med si
(hænger), men jeg kan stadig trin via openOCD. Jeg finder ud af, at den funktion, der er forgrenet til, faktisk er en gyldig funktion på adressen
0x08012abc
.
Fra ARM-dokumenterne på bx
skal dens argument være et register, der indeholder en adresse at forgrene sig til.
Det er klart, jeg misforstår eller ser på de forkerte dokumenter.
Jeg prøvede at tilpasse lr
med GDB lige før filialinstruktionen. Ændring af det til 0x0
eller 0xfffffff7
resulterer i en hård fejl kort efter filialen.
Hvordan fungerer denne greninstruktion, når den kaldes med en værdi på 0xfffffffd , resultere i forgrening til en gyldig funktion på 0x08102abc
?