1.4 המחסנית תרגול
תרגול 1 – עבודה עם PUSH ו־POP¶
-
כתוב קוד ששם את הערכים
1111hו־2222hבמחסנית, ואז שולף אותם ל־CXו־DX.
ודא ש־CX = 2222h,DX = 1111h. -
מה יקרה אם תעשה
POP AXפעמיים ברצף, מבלי שקדמו להם שניPUSH? -
כתוב קוד שעושה
PUSHAואזPOPA. מה קורה לרגיסטרים במהלך הפעולה?
תרגול 2 – שימוש ב־CALL ו־RET¶
-
כתוב פונקציה בשם
HelloFuncשמחזירה מיד, ללא פעולה, בעזרתRET. -
כתוב קוד שקורא לפונקציה
HelloFunc, ממשיך אחרי הקריאה, ומבצע פקודה כלשהי (למשל שינוי ערך ב־AX). -
מה נמצא במחסנית מיד לאחר ביצוע
CALL?
תרגול 3 – העברת פרמטרים לפונקציה דרך המחסנית¶
-
כתוב פונקציה
Squareשמקבלת מספר אחד דרךPUSH, מכפילה אותו בעצמו ומחזירה את התוצאה ב־AX. -
כתוב פונקציה
AddTwoשמקבלת שני פרמטרים, מחזירה את סכומם ב־AX. -
כתוב קוד שמדגים שימוש ב־
RET nלפי מוסכמתpascal.
תרגול 4 – משתנים לוקליים עם SP ו־BP¶
-
כתוב פונקציה שמשריינת מקום ל־4 בתים במחסנית (
sub sp, 4) ומשתמשת בהם ל־2 משתנים. -
שמור ערך כלשהו ב־
[bp-2]וחשב את הריבוע שלו בתוך הפונקציה. -
בסוף הפונקציה, נקו את המחסנית בעזרת
mov sp, bpו־pop bp, ואזret.
תרגול 5 – שמירת רגיסטרים בתוך פונקציה¶
-
כתוב פונקציה שמבצעת חישוב תוך שימוש ב־AX ו־BX, אך שומרת את הרגיסטרים בתחילתה ומשחזרת אותם בסופה.
-
מה יקרה אם לא תשחזר את הרגיסטרים בסוף הפונקציה, והקוד הקורא תלוי בהם?
-
הסבר למה הסדר של
POPצריך להיות הפוך מה־PUSH.
תרגול 6 – תבנית מלאה של פונקציה¶
-
כתוב פונקציה בשם
Multiplyשמקבלת שני פרמטרים דרך המחסנית, מחזירה את המכפלה שלהם, ומממשת את כל השלבים:-
push bp -
mov bp, sp -
sub sp, Xל־locals -
push/popלרגיסטרים -
שימוש ב־
[bp+4],[bp+6] -
mov sp, bp,pop bp,ret
-
-
כתוב קוד ראשי שמכין את הפרמטרים, קורא לפונקציה, מפנה את המחסנית אם צריך, ושומר את התוצאה בזיכרון.
תרגול 7 – Calling Convention¶
-
כתוב פונקציה לפי מוסכמת
cdecl. הקוד הקורא ידחוף שני פרמטרים ויפנה אותם אחרי הקריאה. -
כתוב את אותה פונקציה במוסכמת
pascal, עםret 4. -
הסבר את ההבדלים בין שתי הגרסאות – איפה הם נראים בקוד?
תרגול 8 – אתגר¶
-
כתוב פונקציה שמקבלת שלושה פרמטרים (a, b, c), ומחזירה את
a + b * c. -
כתוב פונקציה שמקבלת מספר ויוצרת משתנה לוקלי לתוצאה ביניים. בצע פעולה כלשהי עליו ותחזיר את התוצאה.