您好,我只是对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-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
aarch64 armv8-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/

10-09 03:14