Ответ 1
Инструкция ARM может загружать только ограниченный диапазон мгновенных значений с помощью mov. Проблема в том, что значение должно быть закодировано в самой команде mov. Поскольку все инструкции ARM имеют 32-разрядную ширину, исходная команда, настроенная до ARMv5, имела всего 8 + 4 бит для кодирования непосредственных. При первом 8-битном состоянии может быть загружено любое 8-битное значение int в диапазоне 0-255, а 4 бит - вправо с шагом 2 между 0 и 30.
Таким образом, вы можете загружать такие значения, как:
#0
#122
#121 ror #24 = 30976
#230 ror #12 = 241172480
Но, # 370 не загружается с помощью этой схемы, для этого потребуется нечто вроде #185 ror #31
, которое невозможно.
Существует два способа загрузки вашего непосредственного значения.
- Как вы это уже решили, построив значение за несколько шагов.
- Загружая значение из памяти с помощью ldr:
ldr r7,=#370
Затем ассемблер создаст константный пул и загрузит значение отсюда через pc-относительную адресацию.
Обычно вам нужно создавать константы с двумя инструкциями, если это невозможно (или значение должно быть перемещено) используйте ldr.
Начиная с ARMv7 вы также можете использовать movw
для загрузки любого 16-битного значения в нижней половине регистра при обнулении верхней половины и movt
для загрузки другого 16-битного значения в верхнюю половину, не касаясь нижней половины.