assembly - BIC指令

标签 assembly arm

您好,我只是有一个关于汇编中一些位清除的基本问题。这是我在下面尝试的。

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/

相关文章:

assembly - 我用 ndisasm 看到的函数后面的汇编指令的用途是什么?

arm - 如何在使用 DS-5 时将文件读入目标内存

c - Cortex-M0+ 的预定义 cpu 目标宏

assembly - 如何从 Asm 中的 xmm 寄存器中提取单个字节?

c - 循环组件 x86

汇编 - 试图将字节移动到内存不起作用

assembly - 如何将寄存器中的VALUE移至NASM中的存储变量?

memory-management - ARM 内存重映射

android - arm_neon.h 是否缺少所有 float16_t 类型?

visual-studio - 从 Visual Studio 交叉编译 ARM7 代码