BIC指令

时间:2012-02-23 19:53:04

标签: assembly arm

您好,我刚刚在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

有人能帮我理解这些结果吗?

4 个答案:

答案 0 :(得分:6)

我觉得有趣的是汇编程序(gas)允许你尝试使用超过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

除了后者使用较少的指令和寄存器

答案 1 :(得分:2)

我认为如果你考虑一下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,您将清除Rd的第7位。同样的想法也适用于你以前的例子。

希望这有帮助。

答案 2 :(得分:0)

我在Arduino Due上用arm-none-eabi-gcc 4.8.2测试了这些案例,但第一种情况不同。

// 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 (位清除)指令对Rn中的位执行AND运算,并补充操作数2的值中的相应位。你可以看到它here

答案 3 :(得分:0)

我不擅长 arm 指令,但您代码中的这条指令

BIC R0, R0, #0xBF

#0xBF 是#0b10111111,所以我认为它正在清除 R0 的第 0~6 位和第 8 位。 BIC 是位清除指令。要清除第 7 位,您可以这样做(如果要清除该位,请将位位置设置为 1)

BIC R0, R0, #0b01000000  ; or
BIC R0, R0, #0x40

我认为您不能使用 BIC 指令“设置”一点。 BIC 代表“清除”。