По какому адресу находится Stack Pointer Register в STM32F407?
Stack Pointer находится во Флеш по адресу 0x08000000 А где находится Stack Pointer Register? Слышал что такой есть, но не видел описание и где он находится.
Ответы (1 шт):
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 тоже располагается начальное значение указателя стека.