ФЭНДОМ


Команда BX (branch and exchange) обеспечивает выполнение безусловного перехода с возможным переключением системы команд.

Команда BXNS (branch and exchange non-secure) является разновидностью предыдущей команды, выполняя переключение не системы команд, а текущего режима безопасности.

Кодирование команды

BX{cond}{.N}  Rm
BXNS{cond}{.N}  Rm

Thumb

T1

ARM BX Instruction, T1





Бит NS равен нулю для команды BX и единице для BXNS.

Поле Rm не должно задавать регистр 13 или 15.

Требования к версиям и режимам

Команда BX появилась одновременно с системой команд Thumb в процессорах архитектуры ARMv4T и с тех пор является обязательной во всех вариантах процессоров ARM, в том числе поддерживающих только одну систему команд.

Команда BXNS появилась в архитектуре ARMv8-M в процессорах, имеющих расширение безопасности. Если эта команда выполняется на процессорах без указанного расширения либо в небезопасном режиме, возникает прерывание UsageFault по неопределённой команде.

Выполняемые действия

Если поле Rm задаёт регистр 13 или 15 (SP или PC), поведение непредсказуемо.

Если команда используется в IT-блоке и не является последней командой блока, поведение непредсказуемо.

Если регистр Rm содержит значение EXC_RETURN (возврат из обработчика прерывания):

  • если установлен бит AIRCR.IESB, производится синхронизация (ожидание) возможных прерываний RAS и BusFault, вызванных ранее инициированными действиями;
  • если никаких прерываний не запрошено, выполняется обычное завершение обработки прерывания.

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

Во всех остальных случаях производится переход на адрес, содержащийся в заданном регистре. При этом:

  • если используется команда BXNS (что автоматически подразумевает наличие расширения безопасности), процессор в данный момент находится в режиме безопасного выполнения и младший бит адреса перехода равен нулю, т. е. если осуществляется переход из безопасного режима в небезопасный, производится переключение режима; при наличии FPU или векторного расширения сбрасывается бит CONTROL_S.SFPA; при наличии LOB сбрасывается информация LOB;
  • если описанные выше условия не выполняются (т. е. если осуществляется переход с переключением системы команд), младший бит адреса перехода заносится в бит EPSR.T;
  • осуществляется переход на адрес, заданный 31 старшим битом регистра.
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.