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 של Rn

  • bic(Rd, Rn) Rd &= ~Rn ניקוי ביט של Rd בעזרת מסכה ב-Rn

שימו לב לשימוש ב-”and_“ במקום ”and“, משום ש-”and“ היא מילת מפתח שמורה ב-Python.

4.3. פקודות הזזה וסיבוב

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

  • lsr(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.

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

bit_reverse(Rn) מחזיר את תוכן Rn כשהביטים שלו הפוכים. אם Rn מכיל את הביטים b31 b30..b0 אזי Rd יוגדר ל-b0 b1 b2..b31

ניתן לספור ביטי אפס נגררים על ידי ביצוע היפוך ביטים לפני הרצת clz.