Вам нужно просто прочитать документацию.
The following instructions write a value to the PC, treating that value as an interworking address to branch
to, with low-order bits that determine the new instruction set state:
— BLX (register), BX , and BXJ
— LDR instructions with <Rt> equal to the PC
— POP and all forms of LDM except LDM (exception return), when the register list includes the PC
— in ARM state only, ADC , ADD , ADR , AND , ASR (immediate), BIC , EOR , LSL (immediate), LSR (immediate), MOV ,
MVN , ORR , ROR (immediate), RRX , RSB , RSC , SBC , and SUB instructions with <Rd> equal to the PC and without
flag-setting specified.
Поскольку вы упомянули thumb2, что означает armv6 или новее. (вы сказали thumb2 и в целом означали большой палец?), и я считаю, что документы говорят нам, что это применимо для armv6 и armv7.
Обратите внимание, что бит потребляется инструкцией, компьютер не переносит набор lsbit в режиме большого пальца, он просто используется инструкцией для указания изменения режима.
Также обратите внимание, что вы должны думать в терминах OR 1, а не PLUS 1. Если вы правильно напишете свой код, toolchain предоставит вам правильный адрес с правильным lsbit, если вы добавите один на тот адрес, код, если вы параноик или не сделали это правильно, вы можете ИЛИ один на адрес, и если он у вас там, то уже нет вреда, если он не делает, то он исправляет проблему, которая помешала ей быть там. Я бы никогда не использовал плюс один, хотя в отношении переключения в режим большого пальца.
Означает ли это, что '| 1' будет лучшим суффиксом, чем '+ 1', если компилятор уже настроил адрес? –
Да, за исключением того, что он может скрыть, что компилятор уже установлен, а OR бесполезен. – Dric512
Итак: либо лишний «OR», выполненный в _assembly_ time; или отвратительный сбой из-за выполнения неправильного типа кода. Я думаю, что я знаю, что я предпочел бы ... –