Вопрос

В сборке ARM непосредственные значения кодируются 8-битным значением, что означает, что мы можем кодировать только

(0-256)^2n.

Теперь моя проблема в том, что я хочу очистить старшие 16 бит r0 и заменить их полусловом, хранящимся в r1.Но из-за ограниченного диапазона немедленных действий мне нужно сделать:-

bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16

Можно ли заменить две инструкции bic одной инструкцией?0xffff0000 некодируется.Возможно, мне следует использовать другую логическую операцию для очистки старших 16 бит?

Спасибо

РЕДАКТИРОВАТЬ:Извините, я забыл сказать, что старшие 16 бит r1 пусты, и я использую ARM7TDMI.

Это было полезно?

Решение

Как насчет:

orr r0,r1,r0,lsl #16
mov r0,r0,ror #16

(Это предполагает, что верхний половина R1 пуст, как это сделал ваш контрольный код.) В зависимости от обстоятельств вы можете опустить окончательное движение здесь, объединив его с некоторым более поздним кодом.

Другие советы

Если у вас достаточно новое ядро ​​ARM, заданный вопрос прост:

movt    r0, #0
orr     r0, r0, r1,lsl#16

Видеть http://www.keil.com/support/man/docs/armasm/armasm_cjagdjbf.htm

Однако если у вас есть ARMv6+, вы можете выполнить весь приведенный пример за один раз:

pkhbt   r0, r0, r1,lsl#16

Видеть http://www.keil.com/support/man/docs/armasm/armasm_cihjedjg.htm

«замените его сохраненным полусловом r1» — означает ли это, что вы можете предположить, что старшие 16 бит r1 равны нулю?Если так,

add r0, r1, r0 lsl #16
mov r0, r0 ror #16

Думайте о mov как о заполнителе, так как вы можете переместить ror туда, где в качестве входных данных будет использоваться r0, и действительно выполнить полезную работу в том же цикле.

На ARMv6 (например.MPCore), можно сказать

    uxth    r1, r1
    orr     r0, r1, r0, asl #16

Если вы можете очистить все это, вы могли бы xor это само с собой.

Если вам нужно сохранить нижнюю половину, можете ли вы сдвинуть регистр влево на 8 бит и обратно?Хотя это может быть такое же количество инструкций.

Для кода C

 (a<<16)|((short)b)

gcc генерирует

    mov     r1, r1, asl #16
    mov     r1, r1, asr #16
    orr     r0, r1, r0, asl #16

который не использует никаких немедленных действий - тем не менее, это все равно две инструкции.

Вы можете использовать инструкцию BFC.Битовое поле очищено.Эта инструкция очищает n бит из m бита.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top