2016-06-15 3 views
0

Меня интересуют команды ARM и Thumb2: LDR и LDR.W, ПК, = ADDR для абсолютного перехода на определенный адрес.Переход между Thumb и ARM

Например, когда я перехожу из ARM-кода в ARM, выполняется команда LDR PC, = ADDR. Но что происходит в других сценариях?

от ARM до Thumb2

от Thumb2 к Thumb2

от Thumb2 для ARM

при +1, необходимое для добавления к адресу? и почему?

ответ

0

Правило на самом деле довольно прост:

  • Если бит 0 адреса является 0, процессор будет выполнять код, как ARM код
  • Если бит 1 адреса является 1, процессор будет выполните код как Thumb
  • Конечно, если есть несоответствие, CPU, безусловно, получит ошибку (после выполнения случайного кода), потому что у него нет возможности проверить, является ли код ARM или Thumb.

Это то, что объясняет +1.

Обратите внимание, что в зависимости от компилятора и в зависимости от используемой метки бит 0 адреса может быть автоматически задан компилятором.

+0

Означает ли это, что '| 1' будет лучшим суффиксом, чем '+ 1', если компилятор уже настроил адрес? –

+0

Да, за исключением того, что он может скрыть, что компилятор уже установлен, а OR бесполезен. – Dric512

+0

Итак: либо лишний «OR», выполненный в _assembly_ time; или отвратительный сбой из-за выполнения неправильного типа кода. Я думаю, что я знаю, что я предпочел бы ... –

0

Вам нужно просто прочитать документацию.

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, если вы добавите один на тот адрес, код, если вы параноик или не сделали это правильно, вы можете ИЛИ один на адрес, и если он у вас там, то уже нет вреда, если он не делает, то он исправляет проблему, которая помешала ей быть там. Я бы никогда не использовал плюс один, хотя в отношении переключения в режим большого пальца.

+0

Да, я соглашусь, что код psuedo в документах с оружием неверен, они имеют вырезание и вставку ошибок, связанных с этими битами. Они почти всегда есть. –

Смежные вопросы