По какому адресу находится Stack Pointer Register в STM32F407?

Stack Pointer находится во Флеш по адресу 0x08000000 А где находится Stack Pointer Register? Слышал что такой есть, но не видел описание и где он находится.


Ответы (1 шт):

Автор решения: maestro

SP - это регистр процессора, а регистры не имеют адреса. Поэтому нельзя ответить на вопрос "по какому адресу".

Вместо адреса регистры имеют номер, который записывается в коде инструкции. Если посмотреть в документ ARM Architecture Reference Manual, раздел A8.8.104, то можно найти пример двоичного кодирования инструкции mov.

------------------------------------------
| F E D C B A   9 8   7  6 5 4 3   2 1 0 |
------------------------------------------
| 0 1 0 0 0 1 | 1 0 | D |   Rm   |  Rd   |
------------------------------------------

где Rm - регистр-источник, Rd - регистр назначения.

Регистры R0-R12 кодируются числами от 0 до С. Регистры SP, LR, PC кодируются числами D, E, F соответственно. Тогда на ваш вопрос можно ответить - регистр SP имеет "адрес" 13.

Взглянув на код инструкции, можно увидеть, что поле Rm состоит из 4 бит, а поле Rd - из трёх. Из этого можно сделать вывод, что не любой регистр может быть регистром назначения в инструкции mov. В документе так и написано: в данной кодировке инструкции этот регистр может быть от R0 до R7.

В памяти процессора ARM Cortex по адресу 0x00000000 должно находиться начальное значение указателя стека. Поэтому компиляторы при линковке записывают в первые 4 байта исполняемого файла требуемое значение указателя стека. Процессор при старте извлекает из своей памяти начальное значение и записывает его в регистр SP.

В контроллерах STM32 регион памяти 0x08000000 отображается на 0x00000000, так что да - по адресу 0x08000000 тоже располагается начальное значение указателя стека.

→ Ссылка