Почему Link, зарегистрированный в моем контроллере ARM, указывает на обратный адрес + 1 - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть фиктивный код:

int main()
{
    while(1)
    {
        LED_Initialize();
        LED_On(0);
        delay();
        LED_Off(0);
    }
    return 0;
}

Сборка для фиктивного кода выглядит следующим образом:

0x08000416 F7FFFFB3  BL.W          LED_On (0x08000380)  
    22:                 delay();                        
0x0800041A F7FFFFF3  BL.W          delay (0x08000404)   
    23:                 LED_Off(0);                     
**0x0800041E** 2000      MOVS          r0,#0x00 

Адрес следующей инструкции - 0x0800041E, но регистр связи R14 всегда содержит адрес + 1 в это дело 0x0800041F. Не очень понятно почему? Я знаю, что это связано с инструкцией Thumb, но может ли кто-нибудь объяснить всю концепцию и причину этого? Я использую микроконтроллер STM32F446REXX.

1 Ответ

2 голосов
/ 29 апреля 2020

Это cortex-m4, поэтому вы получаете документ для cortex-m4 и в нем говорится, что он основан на архитектуре armv7-m, поэтому вы получаете справочное руководство по архитектуре для cortex-m4 и

Следующие инструкции приводят к установке в EPSR.T бита [0] значения, загруженного в P C: - BLX или BX. - ЛДР на П C. - POP или LDM, который включает в себя P C.

и так далее:

Бит EPSR.T поддерживает модель взаимодействия архитектуры ARM, однако поскольку ARMv7-M поддерживает только выполнение команд Thumb, для него всегда должно быть указано значение 1. Обновления P C, соответствующие правилам взаимодействия команд Thumb, должны соответствующим образом обновлять EPSR.T. Выполнение инструкций с EPSR.T, установленным в 0, приводит к недопустимому состоянию UsageFault, INVSTATE.

Чтобы быть справедливым, проще go вернуться к исходному кронштейну, который теперь называется архитектурным справочником armv5, где у вас был / у вас полноразмерный и большой палец, и это немного лучше объясняет, что когда эти инструкции используют это значение, они принимают lsbit и принимают решение о режиме, изменяют / остаются в изменении руки / остаются в большом пальце на основе бита [0] , P C НЕ сохраняет этот бит, он используется инструкцией и отправляется в бит T в PSR.

cortex-ms, являющиеся машинами только для большого пальца, должны оставаться в этом режиме, и, как указано, если вы попытаетесь переключиться на режим охраны, вы получите ошибку. (аналогично, если ваша векторная таблица не построена должным образом с набором lsbit, тогда вы не загрузитесь).

И, пожалуйста, подумайте, что это адрес как адрес или один адрес, а не один, потому что, если инструменты работают правильно, то если вы добавляете один, вы получаете недопустимый адрес и сбой / сбой, где, если вы чувствуете, что должны изменить бит, который вам не причинит вреда (если адрес не используется таким образом, то это еще одна ошибка).

Armv7-ar do c будет охватывать бит [0] topi c, а также то, какие инструкции могут переключать режимы, от armv4t, где он запускался, до armv7-ar, еще немало инструкций способны переключать режимы. и компоновщики, такие как gnu ld, добавят вам батут, если вы правильно построите код.

При работе с процессором на этом уровне вы всегда должны иметь документацию по процессору на экране или на столе, чтобы охватить подобные вопросы. И опять же, чтобы быть справедливым, документы, написанные только для большого пальца, выглядят так, как будто вы уже знаете, что работали с полноразмерными руками (от armv4t до armv7ar).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...