בארכיטקטורת x86, דגלים הם ביטים מיוחדים באוגר הסטטוס EFLAGS המשמשים להחזיק מידע על התוצאה של פעולות אריתמטיות ולוגיות.
דגלים אלו משמשים לאחר מכן לשליטה על זרימת התוכנית, כמו בקפיצות מותנות או בלולאות.
במדריך זה נתמקד בדגלים CF – Carry Flag, ZF – Zero Flag, SF – Sign Flag, OF – Overflow Flag, ו-PF – Parity Flag.
אלה הדגלים הבסיסיים בשפת אסמבלי, ותרגילים שכולים את הדגלים האלה יכולים להופיע במבחן מחשבון הקרב בסדנא המעשית.
CF מציין אם הייתה נשיאה Carry מהביט המשמעותי ביותר MSB בפעולות אריתמטיות. דגל זה משמש בעיקר בחישובים לא חתומים Unsigned Arithmetic.
דוגמא:
MOV AL, 0xFF – מאחסן את הערך 0xFF ב-AL
ADD AL, 1 – מחבר 1 ל-AL, התוצאה היא 0x00 והנשיאה נשמרת ב-CF
JC carry_set – קופץ לתווית carry_set אם CF הוא 1
במקרה הזה, הוספת 1 לערך המקסימלי 0xFF ב-AL תגרום לנשיאה, ולכן CF יוגדר ל-1, ופקודת JC תבצע קפיצה אם ה-CF מוגדר.
ZF מוגדר אם התוצאה של פעולה אריתמטית או לוגית היא אפס. דגל זה משמש בעיקר לבדיקת שוויון בהשוואות.
דוגמא:
MOV AL, 5 – מאחסן את הערך 5 ב-AL
SUB AL, 5 – מחסיר 5 מ-AL, התוצאה היא 0, לכן ZF יוגדר ל-1
JZ zero_result – קופץ לתווית zero_result אם ZF הוא 1
במקרה הזה, לאחר החיסור, AL הוא 0 ולכן ZF מוגדר ל-1, והפקודה JZ תקפוץ אם ZF מוגדר.
SF מוגדר אם התוצאה של פעולה היא שלילית, כלומר הביט המשמעותי ביותר MSB הוא 1. דגל זה משמש לציון הסימן של התוצאה באריתמטיקה חתומה Signed Arithmetic.
דוגמא:
MOV AL, 0x80 – מאחסן את הערך 0x80 ב-AL שווה ל-128 בספרות שליליות חתומות
SUB AL, 1 – מחסיר 1 מ-AL, התוצאה היא 0x7F, ולכן SF לא יוגדר
JS sign_set – קופץ לתווית sign_set אם SF הוא 1
במקרה הזה, הביט המשמעותי ביותר של AL לא ישתנה לאחר החיסור, ולכן SF לא יוגדר ופקודת JS לא תקפוץ.
OF מציין גלישה חתומה Signed Overflow, ומשמש כאשר התוצאה של פעולה אריתמטית חתומה היא גדולה מדי כדי להיות מיוצגת באוגר היעד.
דוגמא:
MOV AL, 127 – מאחסן את הערך 127 ב-AL המספר החיובי המקסימלי ב-8 ביטים
ADD AL, 1 – מחבר 1 ל-AL, התוצאה היא -128, OF יוגדר ל-1
JO overflow_occurred – קופץ לתווית overflow_occurred אם OF הוא 1
במקרה הזה, הוספת 1 ל-127 תגרום לגלישה לתוצאה שלילית, ולכן OF יוגדר ופקודת JO תקפוץ אם OF מוגדר.
PF מוגדר אם מספר הביטים המוגדרים 1-bits בביט המשמעותי הנמוך ביותר של התוצאה הוא זוגי. דגל זה משמש בעיקר לבדיקות זוגיות.
דוגמא:
MOV AL, 0x03 – מאחסן את הערך 0x03 ב-AL שיש לו שני 1-bits
ADD AL, 0x02 – מחבר 2 ל-AL, התוצאה היא 0x05 שיש לו שני 1-bits, PF יוגדר ל-1
JP parity_even – קופץ לתווית parity_even אם PF הוא 1
במקרה הזה, לאחר החיבור, יש שני ביטים מוגדרים, ולכן PF יוגדר ופקודת JP תקפוץ אם PF מוגדר.
הדגלים CF, ZF, SF, OF, ו-PF הם כלים חשובים בניהול זרימת התוכנית ב-Assembly x86.
כל אחד מהדגלים הללו מחזיק מידע חשוב על תוצאות פעולות אריתמטיות ולוגיות, ומשמשים לשליטה בתנאים שבהם יש לבצע קפיצות או פעולות אחרות.