Это может быть глупый вопрос, но в моем коде сборки, во время отладки, у меня есть
pop{r2-r6,pc}
и я думаю, что это дает мне серьезное исключение по вине. Я понимаю, что делает поп, но я не уверен, что означает часть ПК. Я не могу найти это объяснение где-либо в Интернете, и это не переменная в моем коде нигде.
Я использую Keil на STM32 в C ++
pc
или же r15
это счетчик команд, регистр, который дает адрес, из которого процессор получает инструкции. Изменение его на другой адрес приводит к тому, что выполнение программы переходит на этот адрес.
В этом случае адрес считывается из стека для возврата из вызова функции; адрес возврата был бы помещен в стек (из регистрация ссылок lr
или же r14
) в начале функции.
Если это приводит к сбою, возможно, это связано с повреждением адреса в стеке. Возможно, вы пишете за пределами локального массива или переполняете стек слишком глубоким уровнем вызова функции.
PC
регистр — это программный счетчик, он содержит адрес следующей инструкции, которая должна быть выполнена в архитектуре ARM (STM32 использует архитектуру ARM).
По умолчанию в сборке ARM он просто перезаписывает регистр ПК при возврате функции. То, что вы видите с помощью выражения pop, — это просто прямой способ вернуться, посмотреть здесь.
Остальная часть вашего вопроса аккуратно объяснена в посте Майка.