Я пишу ассемблерный код ARM, который в какой-то момент должен установить для одного бита регистра значение 1. Это, конечно, лучше всего сделать с помощью метода "register-or
-bitmask". Однако согласно документации ARM, команда Assembly ORR
(побитовое ИЛИ) не принимает немедленные значения. Другими словами, вы можете выполнить только побитовое ИЛИ значение в одном регистре со значением в другом регистре. Когда вы думаете об этом, это имеет смысл, потому что инструкции ARM сами по себе 32-битные, поэтому нет возможности втиснуть 32-битную маску в инструкцию. Однако немедленная запись значения в регистр только для того, чтобы использовать его правильно, неэффективна, потому что это создает чтение после записи опасность, которая останавливает процессор. В общем, каков наиболее эффективный способ ORR
регистр с маской, не тратя впустую регистр на постоянное хранение этой маски в памяти? ARM что-нибудь рекомендует?
Каков наиболее эффективный способ установить один бит регистра в ARM?
Ответы (2)
ORR r0, r1, #0x4
отлично работает в стандартной ARM. Вы можете закодировать немедленные значения в 32-битной инструкции ARM, но их диапазон ограничен. См. это объяснение.
Ваша ссылка указывает на документацию Thumb; вы уверены, что вам нужно использовать инструкции Thumb?
Хотя ARM (или mips, и я предполагаю, что другие) не могут поместиться сразу в полный регистр, ARM действительно имеет операции alu с немедленными значениями. И вы не ограничены от 0x00 до 0xFF, вы можете
orr r0,r0,#0x02000000
например, без проблем. От 0x00 до 0xFF, сдвинутых в любом месте в 32 битах, некоторые инструкции могут дать вам девятый бит от 0x000 до 0x1FF (сдвинут в любом месте), по крайней мере, я, кажется, кое-что помню об этой работе (для одной / нескольких инструкций). Вы кодируете инструкцию, как указано выше, и ассемблер немедленно упаковывает ее в инструкцию за вас.