您好,我只是有一个关于汇编中一些位清除的基本问题。这是我在下面尝试的。
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-armv7a
00000000 <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
aarch64armv8-a
0000000000000000 <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/