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 &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(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 <<= Rnlsr(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 之前先进行位反转来统计尾部零的数量。