Pop{pc} в сборке

Это может быть глупый вопрос, но в моем коде сборки, во время отладки, у меня есть

pop{r2-r6,pc}

и я думаю, что это дает мне серьезное исключение по вине. Я понимаю, что делает поп, но я не уверен, что означает часть ПК. Я не могу найти это объяснение где-либо в Интернете, и это не переменная в моем коде нигде.

Я использую Keil на STM32 в C++

2 ответа

Решение

pc или же r15 это счетчик программ, регистр, который дает адрес, с которого процессор получает инструкции. Изменение его на другой адрес приводит к тому, что выполнение программы переходит на этот адрес.

В этом случае адрес считывается из стека для возврата из вызова функции; обратный адрес был бы помещен в стек (из регистра ссылок lr или же r14) в начале функции.

Если это вызывает сбой, то, возможно, это связано с повреждением адреса в стеке. Возможно, вы пишете за пределами локального массива или переполняете стек слишком глубоким уровнем вызова функции.

PC register - это счетчик программы, он содержит адрес следующей инструкции, которая должна быть выполнена в архитектуре ARM (STM32 использует архитектуру ARM).

По умолчанию в сборке ARM он просто перезаписывает регистр ПК при возврате функции. То, что вы видите в заявлении pop, - это просто прямой способ вернуться, смотрите здесь.

Остальная часть вашего вопроса аккуратно объяснена в посте Майка.

Другие вопросы по тегам