אסמבלי (מחשבון קרב) - דגלים

מדריך לפקודות דגלים ב-Assembly x86

בארכיטקטורת x86, דגלים הם ביטים מיוחדים באוגר הסטטוס EFLAGS המשמשים להחזיק מידע על התוצאה של פעולות אריתמטיות ולוגיות.
דגלים אלו משמשים לאחר מכן לשליטה על זרימת התוכנית, כמו בקפיצות מותנות או בלולאות.
במדריך זה נתמקד בדגלים CF – Carry Flag, ZF – Zero Flag, SF – Sign Flag, OF – Overflow Flag, ו-PF – Parity Flag.



אלה הדגלים הבסיסיים בשפת אסמבלי, ותרגילים שכולים את הדגלים האלה יכולים להופיע במבחן מחשבון הקרב בסדנא המעשית.

CF – Carry 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 – Zero Flag

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 – Sign Flag

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 – Overflow Flag

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 – Parity Flag

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.
כל אחד מהדגלים הללו מחזיק מידע חשוב על תוצאות פעולות אריתמטיות ולוגיות, ומשמשים לשליטה בתנאים שבהם יש לבצע קפיצות או פעולות אחרות.

תודה! בזכותכם נוכל להשתפר