4. 逻辑与按位指令

4.1. 文档约定

记法:Rd, Rn 表示 ARM 寄存器 R0-R7,特殊指令的情况除外,在那些情况下可以使用 R0-R15。Rn<a-b> 表示一个内容必须位于范围 a <= contents <= b 内的 ARM 寄存器。对于带有两个寄存器参数的指令,允许它们相同。例如,无论 R0 的初始内容如何,下面的指令都会将其清零(Python 中的 R0 ^= 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 = Rn ^ 0xffffffff 即 Rd = Rn 的反码(1 的补码)

  • bic(Rd, Rn) Rd &= ~Rn 使用 Rn 中的掩码对 Rd 进行位清除

注意使用 "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 = rotate_right(Rd, Rn) Rd 向右旋转 Rn 位。

(例如)旋转三位的工作方式如下。如果 Rd 最初包含位 b31 b30..b0,旋转后它将包含 b2 b1 b0 b31 b30..b3

4.4. 特殊指令

这些指令不影响条件码。

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

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

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

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

可以通过在执行 clz 之前先进行位反转来统计尾部零的数量。