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