Ответ 1
Это правильно. Если для чтения используется pc
, в режиме ARM есть 8-байтовое смещение и 4-байтовое смещение в режиме Thumb.
Из ARM-ARM:
Когда инструкция считывает ПК, считывание значения зависит от того, какая команда устанавливает его:
- Для команды ARM чтение - это адрес команды плюс 8 байт. Биты [1: 0] этого значения всегда равны нулю, поскольку инструкции ARM всегда выравниваются по словам.
- Для команды Thumb, прочитанное значение - это адрес команды плюс 4 байта. Бит [0] этого значения всегда равен нулю, потому что инструкции Thumb всегда выравниваются по полуслову.
Этот способ чтения ПК в основном используется для быстрой, независимой от позиции адресации ближайших инструкций и данных, включая независимое от позиции разветвление внутри программы.
Есть две причины для относительной адресации с ПК.
- Независимый от положения код, который находится в вашем случае.
- Получить некоторые сложные константы, которые не могут быть записаны в 1 простой инструкции, например.
mov r3, #0x12345678
невозможно выполнить в 1 инструкции, поэтому компилятор может поместить эту константу в конец функции и использовать, например,ldr r3, [pc, #0x50]
, чтобы загрузить его.
Я не знаю, что означает mov r3, #0x93, 30
. Вероятно, это mov r3, #0x93, rol 30
(что дает 0xC0000024
)?