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 Rn

  • bic(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 right

  • asr(Rd, Rn<1-32>) Rd >>= Rn arithmetic shift right

  • ror(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之前,可通过执行一次位反转来计算尾部零点。