Вы возвращаетесь в LR из обработки неопределенных команд, потому что это указывает на инструкцию после той, которая вызвала ловушку; Вы не хотите снова возвращаться к той же неопределенной инструкции, она попадет только в ту же ловушку.
Вы возвращаетесь в LR-4 из prefetch-abort, если хотите снова выполнить ту же инструкцию; возможно потому, что вы подключили к нему немного памяти, чтобы она теперь работала.
В какой точке конвейера ARM7 на самом деле увеличивает свой ПК, не имеет значения, потому что значение ПК во время выполнения и, следовательно, значение LR в обработчиках сброса - это то, что заложено как часть архитектуры ARM стандарт, основанный в основном на том, что делал древний ARM2 со своим ПК.
Тем не менее, я думаю, что ПК должен быть назначен LR-2, если исходное состояние - Thumb
Это имело бы смысл, но тогда обработчик исключений должен был бы знать, был ли исходный код, вызвавший его срабатывание, кодом ARM или Thumb. Это также могло повлиять на совместимость, так как вокруг было много кода обработки исключений, не поддерживающего Thumb. Таким образом, вместо этого архитектура Thumb выдумывает LR при входе в обработчики исключений, чтобы обработчик всегда мог использовать одну и ту же инструкцию для возврата, ту, которую они использовали для не-Thumb кода.