4. คำสั่งตรรกะและบิตไวส์

4.1. ข้อตกลงในเอกสาร

สัญลักษณ์: Rd, Rn หมายถึงรีจิสเตอร์ ARM R0-R7 ยกเว้นในกรณีของคำสั่งพิเศษที่อาจใช้ R0-R15 ได้ Rn<a-b> หมายถึงรีจิสเตอร์ ARM ที่เนื้อหาต้องอยู่ในช่วง a <= contents <= b ในกรณีของคำสั่งที่มีอาร์กิวเมนต์รีจิสเตอร์สองตัว อนุญาตให้เป็นรีจิสเตอร์เดียวกันได้ ตัวอย่างเช่น รายการต่อไปนี้จะเคลียร์ 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 = 1's complement ของ Rn

  • bic(Rd, Rn) Rd &= ~Rn bit clear Rd โดยใช้ mask ใน Rn

โปรดสังเกตการใช้ "and_" แทน "and" เนื่องจาก "and" เป็น keyword สงวนใน Python

4.3. คำสั่ง shift และการหมุน

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn การเลื่อนบิตไปทางขวาแบบ logical

  • asr(Rd, Rn<1-32>) Rd >>= Rn การเลื่อนบิตไปทางขวาแบบ arithmetic

  • 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

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

bit_reverse(Rn) คืนค่าเนื้อหาของ Rn ที่กลับบิต หาก Rn มีบิต b31 b30..b0 Rd จะถูกตั้งเป็น b0 b1 b2..b31

สามารถนับ trailing zero ได้โดยดำเนินการ bit reverse ก่อนดำเนินการ clz