4. 逻辑&位运算指令¶
4.1. 文件约定¶
符号:除使用R0-R15的特殊指令的情况外, Rd, Rn
表示ARM寄存器R0-R7。 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
i.e. Rd = 1’s complement of Rnbic(Rd, Rn)
Rd &= ~Rn
bit clear Rd using mask in Rn
注意:使用 “and_” 而非 “and” ,因为 “and” 在Python中是保留关键字。
4.3. 转换和旋转指令¶
lsl(Rd, Rn<0-31>)
Rd <<= Rn
lsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> Rn
Logical shift rightasr(Rd, Rn<1-32>)
Rd >>= Rn
arithmetic shift rightror(Rd, Rn<1-31>)
Rd = rotate_right(Rd, Rn)
Rd is rotated right Rn bits.
三位旋转运行如下。若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中第一个二进制位之前的二进制零位数。
rbit(Rd, Rn)
Rd = bit_reverse(Rn)
bit_reverse(Rn) 返回Rn的位反转内容。若Rn包含位 b31 b30..b0
,则Rd将设置为 b0 b1 b2..b31
。
在执行clz之前,可通过执行一次位反转来计算尾部零点。