Эти смещения связаны с конвейерной обработкой процессора и этапами выборки / декодирования / выполнения.
Счетчик программ процессора (ПК) обновляется в определенные моменты во время выполнения.Исключения могут возникать на разных этапах извлечения / декодирования / выполнения.
В случае прерывания предварительной выборки инструкция не может быть (не была выполнена);исключение возникает только тогда, когда процессор фактически пытается выполнить инструкцию (некоторые предварительно выбранные инструкции могут не выполняться).
В случае сброса данных выполняется инструкция, и выполнение инструкции вызывает исключение.
Из документации ARM:
Относительно прерывания предварительной выборки:
[Исключение прерывания предварительной выборки] Происходит, когда процессор пытается выполнитьинструкция, предварительно извлеченная с недопустимого адреса, то есть адреса, определенного подсистемой управления памятью, недоступна процессору в его текущем режиме.
... Инструкции, уже находящиеся в конвейере, продолжают выполняться до тех пор, пока недопустимая инструкция будет достигнута, и в этот момент будет сгенерировано прерывание предварительной выборки.
... поскольку счетчик программы не обновляется в момент выдачи прерывания предварительной выборки, lr_ABTуказывает на инструкцию, следующую за той, которая вызвалана.Обработчик должен вернуться к lr_ABT - 4
и относительно сброса данных:
[Исключение сброса данных] Происходит, когдакоманда передачи данных пытается загрузить или сохранить данные по недопустимому адресу.
Когда команда загрузки или сохранения пытается получить доступ к памяти, счетчик программ был обновлен. Сохраненное значение (pc- 4) в lr_ABT указывает на вторую инструкцию за пределами адреса, где было сгенерировано исключение.Когда MMU загрузит соответствующий адрес в физическую память, обработчик должен вернуться к исходной прерванной инструкции, чтобы можно было предпринять вторую попытку выполнить ее. Адрес возврата, следовательно, на два слова (восемь байтов) меньше, чем в lr_ABT
Таким образом, другими словами, для сброса данных обработчик должен вернуться к lr_ABT- 8 (двумя словами / инструкциями ранее)