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.