לדלג לתוכן

1.3 - בקרת זרימה ולולאות - תרגול

תרגול 1 - דגלים בסיסיים

  1. הסבר מה קורה לדגלים ZF, CF, SF לאחר הביצוע של כל אחת מהפקודות הבאות:

    • mov ax, 5
      sub ax, 5

    • mov ax, 10
      sub ax, 20

    • mov ax, 0FFFFh
      add ax, 1

  2. מה ההבדל בין Overflow Flag (OF) ל-Carry Flag (CF)? מתי כל אחד מהם מופעל?

  3. האם הפעולה cmp ax, bx משנה את הערכים של AX או BX? אם לא, מה כן משתנה?

תרגול 2 - כתיבת תנאים עם cmp ופקודות קפיצה

  1. כתוב תוכנית שמשווה בין שני מספרים:

    • אם הם שווים, כתוב 1 למשתנה בשם equal

    • אם המספר הראשון גדול מהשני, כתוב 2 למשתנה בשם greater

    • אם המספר הראשון קטן מהשני, כתוב 3 למשתנה בשם less

  2. כתוב קוד שמבצע את הפעולה cmp al, 0, ואם AL שווה לאפס - כתוב 1 למשתנה zero_flagged, אחרת כתוב 0.

  3. כתוב קוד שבו נשמר ערך ב-AX. אם הערך שלילי (Signed), כתוב -1 ל-sign_status, ואם חיובי או אפס - כתוב 0.

תרגול 3 - לולאות עם קפיצות מותנות

  1. כתוב לולאה שרצה 10 פעמים (למשל באמצעות CX), ובכל סיבוב מגדילה משתנה בשם counter ב-1.

  2. כתוב לולאה שסופרת לאחור מ-20 עד 0 (כולל), ומכניסה את הערך האחרון למשתנה בשם done_value.

  3. כתוב לולאה שמריצה את עצמה כל עוד הערך ב-AL הוא אי זוגי.
    (טיפ: השתמש בפקודה test al, 1 כדי לבדוק זוגיות).

תרגול 4 - בחינה לפי דגלים ישירים

  1. כתוב קוד שמחשב mov al, 100 ואז add al, 200,
    ובודק האם התרחש overflow. אם כן, כתוב 1 למשתנה בשם overflow_happened.

  2. כתוב קוד שמבצע פעולת חיסור בין שני ערכים -
    אם התוצאה היא שלילית (Signed), כתוב 1 למשתנה is_negative.

  3. כתוב קוד שמחשב cmp ax, bx -
    אם התוצאה אינה שווה, כתוב 99 למשתנה not_equal_flag.

תרגול 5 - סימולציה של תנאים עם קפיצות

  1. כתוב תוכנית שמבצעת בדיקה של ציון:

    • אם הציון מתחת ל-60 → כתוב "נכשל"

    • אם בין 60 ל-85 → כתוב "עובר"

    • אם מעל 85 → כתוב "מעולה"

    (טיפ: הציון יכול להיות במשתנה בזיכרון בשם grade)

  2. כתוב קוד שקופץ ל-label אחר רק אם לא קרתה נשיאה (Carry) אחרי חיבור בין שני ערכים.

  3. כתוב קוד שמבצע פעולה כלשהי רק אם התוצאה אינה אפס, תוך שימוש ב-TEST ו-JNZ.