您好,我只是对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
谁能帮助我了解这些结果?
最佳答案
我发现有趣的是,汇编器(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
除了后者使用较少的指令和寄存器编辑
r0,r1,r2,arm标签等表示这是armv7-a或更旧的问题,而不是aarch64(x0,w0,w1等)。
但是您可以看到编译器是否可以帮助您找出适用于您的体系结构( ARM 或其他)的指令。
unsigned int fun1(unsigned int x)
{
return (x&(~6));
}
unsigned long long fun2(unsigned long long x)
{
return (x&(~6));
}
armv4t-armv7a00000000 <fun1>:
0: e3c00006 bic r0, r0, #6
4: e12fff1e bx lr
00000008 <fun2>:
8: e3c00006 bic r0, r0, #6
c: e12fff1e bx lr
所有拇指变体00000000 <fun1>:
0: 2306 movs r3, #6
2: 4398 bics r0, r3
4: 4770 bx lr
6: 46c0 nop ; (mov r8, r8)
00000008 <fun2>:
8: 2306 movs r3, #6
a: 4398 bics r0, r3
c: 4770 bx lr
e: 46c0 nop ; (mov r8, r8)
armv7-m(虽然不是armv6-m,但有一些armv8-m但不是全部)00000000 <fun1>:
0: f020 0006 bic.w r0, r0, #6
4: 4770 bx lr
6: bf00 nop
00000008 <fun2>:
8: f020 0006 bic.w r0, r0, #6
c: 4770 bx lr
e: bf00 nop
aarch64 armv8-a0000000000000000 <fun1>:
0: 121d7400 and w0, w0, #0xfffffff9
4: d65f03c0 ret
8: d503201f nop
c: d503201f nop
0000000000000010 <fun2>:
10: 927df400 and x0, x0, #0xfffffffffffffff9
14: d65f03c0 ret
关于assembly - BIC说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9420218/