1.3 בקרת זרימה ולולאות תרגול
תרגול 1 – דגלים בסיסיים¶
-
הסבר מה קורה לדגלים ZF, CF, SF לאחר הביצוע של כל אחת מהפקודות הבאות:
-
mov ax, 5
sub ax, 5 -
mov ax, 10
sub ax, 20 -
mov ax, 0FFFFh
add ax, 1
-
-
מה ההבדל בין Overflow Flag (OF) ל־Carry Flag (CF)? מתי כל אחד מהם מופעל?
-
האם הפעולה
cmp ax, bxמשנה את הערכים של AX או BX? אם לא, מה כן משתנה?
תרגול 2 – כתיבת תנאים עם cmp ופקודות קפיצה¶
-
כתוב תוכנית שמשווה בין שני מספרים:
-
אם הם שווים, כתוב
1למשתנה בשםequal -
אם המספר הראשון גדול מהשני, כתוב
2למשתנה בשםgreater -
אם המספר הראשון קטן מהשני, כתוב
3למשתנה בשםless
-
-
כתוב קוד שמבצע את הפעולה
cmp al, 0, ואם AL שווה לאפס – כתוב1למשתנהzero_flagged, אחרת כתוב0. -
כתוב קוד שבו נשמר ערך ב־AX. אם הערך שלילי (Signed), כתוב
-1ל־sign_status, ואם חיובי או אפס – כתוב0.
תרגול 3 – לולאות עם קפיצות מותנות¶
-
כתוב לולאה שרצה 10 פעמים (למשל באמצעות
CX), ובכל סיבוב מגדילה משתנה בשםcounterב־1. -
כתוב לולאה שסופרת לאחור מ־20 עד 0 (כולל), ומכניסה את הערך האחרון למשתנה בשם
done_value. -
כתוב לולאה שמריצה את עצמה כל עוד הערך ב־AL הוא אי זוגי.
(טיפ: השתמש בפקודהtest al, 1כדי לבדוק זוגיות).
תרגול 4 – בחינה לפי דגלים ישירים¶
-
כתוב קוד שמחשב
mov al, 100ואזadd al, 200,
ובודק האם התרחש overflow. אם כן, כתוב1למשתנה בשםoverflow_happened. -
כתוב קוד שמבצע פעולת חיסור בין שני ערכים –
אם התוצאה היא שלילית (Signed), כתוב1למשתנהis_negative. -
כתוב קוד שמחשב
cmp ax, bx–
אם התוצאה אינה שווה, כתוב99למשתנהnot_equal_flag.
תרגול 5 – סימולציה של תנאים עם קפיצות¶
-
כתוב תוכנית שמבצעת בדיקה של ציון:
-
אם הציון מתחת ל־60 → כתוב "נכשל"
-
אם בין 60 ל־85 → כתוב "עובר"
-
אם מעל 85 → כתוב "מעולה"
(טיפ: הציון יכול להיות במשתנה בזיכרון בשם
grade) -
-
כתוב קוד שקופץ ל־label אחר רק אם לא קרתה נשיאה (Carry) אחרי חיבור בין שני ערכים.
-
כתוב קוד שמבצע פעולה כלשהי רק אם התוצאה אינה אפס, תוך שימוש ב־
TESTו־JNZ.