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.