Каков наиболее эффективный способ установить один бит регистра в ARM?

Я пишу ассемблерный код ARM, который в какой-то момент должен установить для одного бита регистра значение 1. Это, конечно, лучше всего сделать с помощью метода "register-or-bitmask". Однако согласно документации ARM, команда Assembly ORR (побитовое ИЛИ) не принимает немедленные значения. Другими словами, вы можете выполнить только побитовое ИЛИ значение в одном регистре со значением в другом регистре. Когда вы думаете об этом, это имеет смысл, потому что инструкции ARM сами по себе 32-битные, поэтому нет возможности втиснуть 32-битную маску в инструкцию. Однако немедленная запись значения в регистр только для того, чтобы использовать его правильно, неэффективна, потому что это создает чтение после записи опасность, которая останавливает процессор. В общем, каков наиболее эффективный способ ORR регистр с маской, не тратя впустую регистр на постоянное хранение этой маски в памяти? ARM что-нибудь рекомендует?


person Phonon    schedule 07.10.2011    source источник
comment
На какой процессор вы ориентируетесь? Cortex-M3 имеет битовый полосатая область памяти, что является лучшим способом сделать это, если у вас есть такая возможность.   -  person Kevin Vermeer    schedule 07.10.2011


Ответы (2)


ORR r0, r1, #0x4

отлично работает в стандартной ARM. Вы можете закодировать немедленные значения в 32-битной инструкции ARM, но их диапазон ограничен. См. это объяснение.

Ваша ссылка указывает на документацию Thumb; вы уверены, что вам нужно использовать инструкции Thumb?

person Graham Borland    schedule 07.10.2011
comment
Извините, сайт ARM перенаправляется в какое-то странное место. Ссылку уберу. - person Phonon; 07.10.2011
comment
Думаю, мы просто нашли случайность в документации. =) Немедленный режим упоминается обычно, но для него нет отдельной страницы, как для всего остального в руководстве, как и для всего остального. Спасибо =) - person Phonon; 07.10.2011
comment
@Phonon В моих копиях ARMARM (v7AR и v7M) ORR (немедленное) выделено на отдельной странице. Какую документацию вы используете? - person James Greenhalgh; 08.10.2011

Хотя ARM (или mips, и я предполагаю, что другие) не могут поместиться сразу в полный регистр, ARM действительно имеет операции alu с немедленными значениями. И вы не ограничены от 0x00 до 0xFF, вы можете

orr r0,r0,#0x02000000 

например, без проблем. От 0x00 до 0xFF, сдвинутых в любом месте в 32 битах, некоторые инструкции могут дать вам девятый бит от 0x000 до 0x1FF (сдвинут в любом месте), по крайней мере, я, кажется, кое-что помню об этой работе (для одной / нескольких инструкций). Вы кодируете инструкцию, как указано выше, и ассемблер немедленно упаковывает ее в инструкцию за вас.

person old_timer    schedule 07.10.2011