לדלג לתוכן

1.4 המחסנית תרגול

תרגול 1 – עבודה עם PUSH ו־POP

  1. כתוב קוד ששם את הערכים 1111h ו־2222h במחסנית, ואז שולף אותם ל־CX ו־DX.
    ודא ש־CX = 2222h, DX = 1111h.

  2. מה יקרה אם תעשה POP AX פעמיים ברצף, מבלי שקדמו להם שני PUSH?

  3. כתוב קוד שעושה PUSHA ואז POPA. מה קורה לרגיסטרים במהלך הפעולה?


תרגול 2 – שימוש ב־CALL ו־RET

  1. כתוב פונקציה בשם HelloFunc שמחזירה מיד, ללא פעולה, בעזרת RET.

  2. כתוב קוד שקורא לפונקציה HelloFunc, ממשיך אחרי הקריאה, ומבצע פקודה כלשהי (למשל שינוי ערך ב־AX).

  3. מה נמצא במחסנית מיד לאחר ביצוע CALL?


תרגול 3 – העברת פרמטרים לפונקציה דרך המחסנית

  1. כתוב פונקציה Square שמקבלת מספר אחד דרך PUSH, מכפילה אותו בעצמו ומחזירה את התוצאה ב־AX.

  2. כתוב פונקציה AddTwo שמקבלת שני פרמטרים, מחזירה את סכומם ב־AX.

  3. כתוב קוד שמדגים שימוש ב־RET n לפי מוסכמת pascal.


תרגול 4 – משתנים לוקליים עם SP ו־BP

  1. כתוב פונקציה שמשריינת מקום ל־4 בתים במחסנית (sub sp, 4) ומשתמשת בהם ל־2 משתנים.

  2. שמור ערך כלשהו ב־[bp-2] וחשב את הריבוע שלו בתוך הפונקציה.

  3. בסוף הפונקציה, נקו את המחסנית בעזרת mov sp, bp ו־pop bp, ואז ret.


תרגול 5 – שמירת רגיסטרים בתוך פונקציה

  1. כתוב פונקציה שמבצעת חישוב תוך שימוש ב־AX ו־BX, אך שומרת את הרגיסטרים בתחילתה ומשחזרת אותם בסופה.

  2. מה יקרה אם לא תשחזר את הרגיסטרים בסוף הפונקציה, והקוד הקורא תלוי בהם?

  3. הסבר למה הסדר של POP צריך להיות הפוך מה־PUSH.


תרגול 6 – תבנית מלאה של פונקציה

  1. כתוב פונקציה בשם Multiply שמקבלת שני פרמטרים דרך המחסנית, מחזירה את המכפלה שלהם, ומממשת את כל השלבים:

    • push bp

    • mov bp, sp

    • sub sp, X ל־locals

    • push/pop לרגיסטרים

    • שימוש ב־[bp+4], [bp+6]

    • mov sp, bp, pop bp, ret

  2. כתוב קוד ראשי שמכין את הפרמטרים, קורא לפונקציה, מפנה את המחסנית אם צריך, ושומר את התוצאה בזיכרון.


תרגול 7 – Calling Convention

  1. כתוב פונקציה לפי מוסכמת cdecl. הקוד הקורא ידחוף שני פרמטרים ויפנה אותם אחרי הקריאה.

  2. כתוב את אותה פונקציה במוסכמת pascal, עם ret 4.

  3. הסבר את ההבדלים בין שתי הגרסאות – איפה הם נראים בקוד?


תרגול 8 – אתגר

  1. כתוב פונקציה שמקבלת שלושה פרמטרים (a, b, c), ומחזירה את a + b * c.

  2. כתוב פונקציה שמקבלת מספר ויוצרת משתנה לוקלי לתוצאה ביניים. בצע פעולה כלשהי עליו ותחזיר את התוצאה.