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