4. 逻辑和位指令

4.1. 文档约定

符号:表示 ARM 寄存器 R0-R7,特殊指令除外,其中可能使用 R0-R15。表示一个 ARM 寄存器,其内容必须在 range 内。对于具有两个寄存器参数的指令,允许它们相同。例如,无论其初始内容如何,以下内容都会将 R0 (Python )归零。Rd, RnRn<a-b> a <= contents <= bR0 ^= R0

  • eor(r0, r0)

除非另有说明,否则这些指令会影响条件标志。

4.2. 逻辑指令

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn)即 Rd = 1 的 Rn 补码 Rd = Rn ^ 0xffffffff

  • bic(Rd, Rn)使用 Rn 中的掩码清除 RdRd &= ~Rn

请注意使用“and_”而不是“and”,因为“and”是 Python 中的保留关键字。

4.3. 移位和旋转指令

  • lsl(Rd, Rn<0-31>) Rd <<= Rn

  • lsr(Rd, Rn<1-32>)逻辑右移Rd = (Rd & 0xffffffff) >> Rn

  • asr(Rd, Rn<1-32>)算术右移 Rd >>= Rn

  • ror(Rd, Rn<1-31>) Rd 向右循环 Rn 位。 Rd = rotate_right(Rd, Rn)

旋转(例如)三位的工作原理如下。如果 Rd在旋转后最初包含位,它将包含 b31 b30..b0 after rotation it will contain b2 b1 b0 b31 b30..b3

4.4. 特殊说明

条件代码不受这些指令的影响。

  • clz(Rd, Rn) Rd = count_leading_zeros(Rn)

count_leading_zeros(Rn) 返回 Rn 中第一个二进制一位之前的二进制零位的数量。

  • rbit(Rd, Rn) Rd = bit_reverse(Rn)

bit_reverse(Rn) 返回 Rn 的位反转内容。如果 Rn 包含位Rd 将被设置为b31 b30..b0b0 b1 b2..b31

可以通过在执行 clz 之前执行位反转来计算尾随零。