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 &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffכלומר Rd = המשלים ל-1 של Rnbic(Rd, Rn)
Rd &= ~Rnניקוי ביט של Rd בעזרת מסכה ב-Rn
שימו לב לשימוש ב-”and_“ במקום ”and“, משום ש-”and“ היא מילת מפתח שמורה ב-Python.
4.3. פקודות הזזה וסיבוב¶
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(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.