Когда процессор ARM7 увеличивает свой регистр ПК? - PullRequest
2 голосов
/ 15 апреля 2010

Я некоторое время думаю об этом вопросе: когда процессор ARM7 (с 3 конвейерами) увеличивает свой регистр ПК.

Сначала я думал, что после выполнения инструкции процессор сначала проверяетесть ли исключение в последнем выполнении, затем увеличьте ПК на 2 или 4 в зависимости от текущего состояния.В случае возникновения исключения ARM7 изменит свой режим работы, сохранит ПК в LR текущего режима и начнет обрабатывать текущее исключение без изменения регистра ПК.

Но это не имеет смысла при анализе возвращаемых инструкций.Я не могу понять, почему ПК будет назначен LR при возврате из неопределенной инструкции-исключения, а LR-4 из prefetch-abort-exception, не произошли ли оба этих исключения в состоянии декодирования?Более того, согласно моему учебнику, ПК всегда будет назначаться LR-4 при возврате из prefetch-abort-exception, независимо от того, в каком состоянии находится процессор (ARM или Thumb) до возникновения исключения.Тем не менее, я думаю, что ПК следует назначить LR-2, если исходное состояние - Thumb, так как инструкция Thumb имеет длину 2 байта вместо 4 байтов, которые содержит инструкция ARM, и мы просто хотим откатить инструкцию в текущем состоянии,Есть ли недостатки в моих рассуждениях или что-то не так с учебником.

Кажется, длинный вопрос.Я действительно надеюсь, что кто-нибудь может помочь мне получить правильный ответ.

Заранее спасибо.

1 Ответ

2 голосов
/ 15 апреля 2010

Вы возвращаетесь в LR из обработки неопределенных команд, потому что это указывает на инструкцию после той, которая вызвала ловушку; Вы не хотите снова возвращаться к той же неопределенной инструкции, она попадет только в ту же ловушку.

Вы возвращаетесь в LR-4 из prefetch-abort, если хотите снова выполнить ту же инструкцию; возможно потому, что вы подключили к нему немного памяти, чтобы она теперь работала.

В какой точке конвейера ARM7 на самом деле увеличивает свой ПК, не имеет значения, потому что значение ПК во время выполнения и, следовательно, значение LR в обработчиках сброса - это то, что заложено как часть архитектуры ARM стандарт, основанный в основном на том, что делал древний ARM2 со своим ПК.

Тем не менее, я думаю, что ПК должен быть назначен LR-2, если исходное состояние - Thumb

Это имело бы смысл, но тогда обработчик исключений должен был бы знать, был ли исходный код, вызвавший его срабатывание, кодом ARM или Thumb. Это также могло повлиять на совместимость, так как вокруг было много кода обработки исключений, не поддерживающего Thumb. Таким образом, вместо этого архитектура Thumb выдумывает LR при входе в обработчики исключений, чтобы обработчик всегда мог использовать одну и ту же инструкцию для возврата, ту, которую они использовали для не-Thumb кода.

...