Ответы содержатся в ARM ARM (ARM Architectural Reference Manual).Например, посмотрите на BX в инструкциях ARM и Thumb.Есть дополнительные инструкции на случай, если это домашний вопрос.
Также посмотрите на псевдокод, чтобы узнать, что происходит, когда возникает исключение:
R14_ = return link
SPSR_ = CPSR
CPSR[4:0] = exception mode number
CPSR[5] = 0
if == Reset or FIQ then
CPSR[6] = 1
CPSR[7] = 1
if != UNDEF or SWI then
CPSR[8] = 1
CPSR[9] = CP15_reg1_EEbit
PC = exception vector address
Комментарии к псевдокоду выше (вARM ARM) опишите еще один ответ на ваш вопрос.
Теперь то, что не очевидно, и, возможно, вводит в заблуждение в BX и других описаниях инструкций, так это то, что bx rm не всегда переключает состояния.В описании большого пальца BX говорится «ветки между кодом ARM и кодом Thumb».Как будто использование большого пальца привело бы к тому, что вам нужно постоянно кодировать код.Псевдокод рисует немного лучшую картинку, хотя lsbit адреса в регистре говорит вам, переходите ли вы к большому или ручному коду.Хотя псевдокод ПК в описании большого пальца вводит в заблуждение.Инструкции большого пальца состоят из 16 битов, и компьютер перемещается вперед на 16 битов за раз 0x00, 0x02, 0x04 и т. Д. В режиме постановки на охрану инструкции являются 32-битными, а компьютер переходит на 0x00, 0x04, 0x08 и т. Д. (См. Инструкции ARM для ветвлений).ветвь sign_immed << 2, 0,4,8 и т. д. thumb ветвь sign_immed << 1, 0,2,4,6 и т. д.) </p>
В основном, если у вас есть смешанная программа, которую вы хотитеиспользовать BX вместо B, в частности, при возврате bx lr вместо mov pc, lr.Таким образом, функции большого пальца и руки будут использовать bx lr для возврата.Все четыре случая покрыты: рука, вызывающая руку, рука, вызывающая большой палец, рука, вызывающая большой палец, и палец, вызывающий большой палец.
Так что ищите инструкции, которые влияют на T-бит cpsr и / или влияют на счетчик программы в некотором смысле.это приводит к тому, что счетчик программ где-то ветвится.Также будьте осторожны, чтобы ограничиться определенным семейством / ядром, которое вас интересует (при чтении ARM ARM), armv4t, armv6, armv6 и т. Д. Вы, вероятно, хотите получить TRM (Техническое справочное руководство) для конкретного ядра, которым вы являетесь.используя также.ARM ARM очень универсален, и, поскольку количество ядер увеличивается с течением времени, конкретные различия не ясны в ARM ARM.Вам нужен TRM.
У меня много оборотов ARM ARM, и все они содержат ошибки / ошибки.Преднамеренно или нет, я не знаю, поэтому всегда требуется некоторый взлом, чтобы узнать, как реально работает ядро, которое вы используете.
РЕДАКТИРОВАТЬ в 2018
Iя не собираюсь составлять список для каждого ядра и т. д. и т. д. Именно для этого предназначена документация arm, а не для stackoverflow.
Но, опять же, ответ лежит в справочных руководствах по архитектуре, доступных в arm. сайт .Возможно, вам придется пожертвовать адрес электронной почты, но оно того стоит.
Ключевое слово, которое вы ищете, это interwork
или , взаимодействующий .Старый / оригинальный рычаг теперь называется armv5 architectural reference manual
, вы ищете T Flag
и посмотрите, какие инструкции меняют этот флаг.Для armv7-m и, возможно, armv8-m ARM вы можете найти адрес поддержки взаимодействия или адрес взаимодействия.И он показывает список инструкций, которые влияют на ПК , но поддерживают или не поддерживают взаимодействие .
Для armv7-a / r я все еще ищу ветку взаимодействия, так что пока я не вижу раздел ... держись ... ищите Переключение между Thumb state
и ARM state
, и есть раздел, который показывает список инструкций для перехода из состояния большого пальца в состояние охраны и список для перехода из состояния охраны в состояние большого пальца.
ARMv6 (не -M) задает ARM armv5 и armv7, но каждая инструкция / кодировка показывает архитектуру, которая ее поддерживает, поэтому вам, возможно, придется пройти через каждую из ветвей взаимодействияинструкции и посмотрите, есть ли у них поддержка armv6 (также показаны armv4 и armv5).Руководства по armv7 - не вся история, хотя в armv4T / armv5T есть кодировка большого пальца blx
, которая не является частью armv6-m / armv7-m, как это было раньше, кодировка blx
теперьчасть расширения thumb2.
Основная команда, поддерживаемая во всем этом, - BX
, другие инструкции зависят от архитектуры в зависимости от того, можете ли вы использовать их для переключения состояний. Если вы пишете эмулятор, удачи, если вы программируете, вы можете попытаться настроиться на архитектуру, но в случае сомнений просто используйте bx
. Обратите внимание, что в arm11-mpcore есть недокументированная ошибка (не более старые arm11s, как в raspberry pi), которая делает предварительную выборку данных после pop pc
или ldr pc
, если эти данные напоминают инструкцию перехода. Я рекомендую не использовать эти инструкции на mpcore arm11, а вместо этого делать pop-стиль armv4t или загружать в энергозависимый регистр и bx с этим. pop {r3}; bx r3
, а не pop {pc}
. Побочные эффекты трудно увидеть, цикл чтения может происходить с периферийным устройством, которое воздействует на чтение, чтение из регистра данных на UART и потерю символа, например. Просто к вашему сведению, нам понадобилось время, чтобы найти и подтвердить это.
Попробую добавить код.