4. Các lệnh logic & bitwise

4.1. Quy ước tài liệu

Ký hiệu: Rd, Rn biểu thị các thanh ghi ARM R0-R7 trừ trong trường hợp các lệnh đặc biệt nơi R0-R15 có thể được sử dụng. Rn<a-b> biểu thị một thanh ghi ARM có nội dung phải nằm trong phạm vi a <= contents <= b. Trong trường hợp các lệnh có hai đối số thanh ghi, được phép chúng giống nhau. Ví dụ, lệnh sau sẽ đặt R0 về không (Python R0 ^= R0) bất kể nội dung ban đầu của nó.

  • eor(r0, r0)

Các lệnh này ảnh hưởng đến các cờ điều kiện trừ khi có ghi chú.

4.2. Các lệnh logic

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff tức là Rd = bù 1 của Rn

  • bic(Rd, Rn) Rd &= ~Rn xóa bit của Rd bằng mặt nạ trong Rn

Lưu ý việc sử dụng "and_" thay vì "and", vì "and" là từ khóa dành riêng trong Python.

4.3. Các lệnh dịch chuyển và xoay

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Dịch logic phải

  • asr(Rd, Rn<1-32>) Rd >>= Rn dịch số học phải

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd được xoay phải Rn bit.

Một phép xoay (ví dụ) ba bit hoạt động như sau. Nếu Rd ban đầu chứa các bit b31 b30..b0 sau khi xoay nó sẽ chứa b2 b1 b0 b31 b30..b3

4.4. Các lệnh đặc biệt

Mã điều kiện không bị ảnh hưởng bởi các lệnh này.

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

count_leading_zeros(Rn) trả về số lượng bit nhị phân bằng không trước bit nhị phân một đầu tiên trong Rn.

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

bit_reverse(Rn) trả về nội dung đảo bit của Rn. Nếu Rn chứa các bit b31 b30..b0, Rd sẽ được đặt thành b0 b1 b2..b31

Các bit không đuôi có thể được đếm bằng cách thực hiện đảo bit trước khi thực thi clz.