БИК Инструкция - PullRequest
       1

БИК Инструкция

5 голосов
/ 23 февраля 2012

Здравствуйте, у меня просто основной вопрос по очистке битов в Assembly. Вот то, что я пытаюсь ниже.

MOV R0, #OxFFFFFFFF   ;Load R0 with the HEX Values FFFFFFFF
BIC R0, R0, #0xBF    ;This should set bit 7 from my understanding as B is 1011 in hex

При выполнении вышеизложенного он помещает следующее значение в R0 (0xFFFFFF4F). Интересно, почему это так?

Если я сделаю этот бит чистым, он установит значение 0xFFFFFFBF

MOV R0, #OxFFFFFFFF   ;Load R0 with the HEX Values FFFFFFFF
BIC R0, R0, #00000000000000000000000001000000b

Может кто-нибудь помочь мне понять эти результаты?

Ответы [ 3 ]

6 голосов
/ 24 февраля 2012

Мне интересно, что ассемблер (газ) позволяет вам пытаться перемещаться с более чем 8 значащими битами без ошибок ... он просто кодирует mvn для вас.

d6008030 <TESTFUN>:
d6008030:   e3e00000    mvn r0, #0
d6008034:   e3c000bf    bic r0, r0, #191    ; 0xbf
d6008038:   e12fff1e    bx  lr

Я получаю 0xFFFFFF40, которыйявляется ожидаемым ответом.

Если вы хотите установить бит 7, то

orr r0,r0,#0x80 ;@ (corrected from 0x70)

Или вы хотели установить бит 6

orr r0,r0,#0x40

, если выхотел удалить все биты, кроме бита 6, оставив только установленный бит 6.

and r0,r0,#0x40

Если вы хотите оставить все, кроме бита 6, установленным (очистить бит 6) (bic = сбросить бит)

bic r0,r0,#0x40

Или вы пытались это сделать

mov r0,#0xFFFFFFFF ;@ this is an interesting shortcut
mov r1,#0xFFFFFFBF ;@ might as well keep using it
bic r0,r0,r1

, что дает 0x00000040, что совпадает с

mov r0,#0xFFFFFFFF ;@ this is an interesting shortcut
and r0,r0,#0x40

, за исключением того, что последний использует меньше инструкций и регистров

2 голосов
/ 28 августа 2013

Я думаю, вы увидите это лучше, если задумаетесь о том, что означает / делает BIC: BIC Rd, Rn означает «Rd AND NOT Rn».

Итак, в вашем последнем примере:

Rn = 00000000000000000000000001000000b = 0x40
NOT Rn = 0xFFFFFFBF = 11111111111111111111111110111111b
Rd = 0xFFFFFFFF = 11111111111111111111111111111111b
Rd AND NOT Rn = 0xFFFFFFFBF = 11111111111111111111111110111111b

Итак, с BIC Rd, # 0x40 вы очищаете бит № 7 от Rd.То же самое относится и к вашему прежнему примеру.

Надеюсь, это поможет.

0 голосов
/ 16 января 2017

Я тестирую случаи с arm-none-eabi-gcc 4.8.2 на Arduino Due, но первый случай отличается.

// the results is 0xffffff40, but not 0xffffff4f
mov r2, #0xffffffff
bic r2, r2, #0xbf

Другой случай тот же.

Таким образом, результат первого случая ясен точно так же, как @Fernando объяснил выше.

operand2 = 0xbf
NOT operand2 = 0xffffff40
r2 = 0xffffffff
r2 AND NOT operand2 = 0xffffff40

Команда BIC (Bit Clear) выполняет операцию И над битами в Rn сдополняет соответствующие биты в значении Operand2.Вы можете видеть это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...