您好,我刚刚在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
有人能帮我理解这些结果吗?
答案 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 代表“清除”。