מבנה המחסנית
נענה כעת על השאלות הבאות: כיצד נשמרים בפועל הנתונים על
המחסנית? מה קורה בפועל כאשר אנו משתמשים בפקודות PUSH ו-POP?
כאשר אנו מגדירים מקטע מחסנית בתוכנית שלנו, אנו למעשה
מגדירים מקטע בלוקים בו יישמרו נתוני המחסנית.
כאשר אנו מגדירים את מקטע המחסנית, אוגר SS מכיל
את כתובת הבסיס של מקטע המחסנית, ואילו אוגר SP מכיל את קצה המחסנית (היסט
מקסימלי), למשל, עבור מחסנית שתוגדר בצורה הבאה, ערכו של SS יהיה כתובת הבסיס, וערכו של SP יהיה
8:
STA SEGMENT STACK
DB 8 DUP (0)
STA ENDS
כאשר נבצע פקודת PUSH בה נדחוף מילה, ערכו של SP יקטן
ב-2 ויהפך ל-6 בדוגמא לעיל.
בתאים 6, 7 יישמר הערך אותו דחפנו.
באופן כללי: בכל רגע SP מכיל את הכתובת שמתחתיה
יוכנסו הנתונים.
כאשר אנו מבצעים פעולת PUSH אנו שומרים את הנתון שנדחף
בתאי הזיכרון שמתחת SP, ומשנים את ערכו של SP כך שיצביע אל התא התחתון
שהוכנס.
נשים לב כי המחסנית של מחשב ה-PC גדלה כלפי מטה, כלומר, כאשר
אנחנו מכניסים עוד ועוד נתונים, הם נשמרים בכתובות זיכרון נמוכות יותר מהכתובות
בהן נשמרו קודמיהם.
כאשר מתבצעת פקודת POP, נשלפים הנתונים מהכתובת SP ומ-SP+1,
ולאחר מכן ערכו של SP גדל ב-2.
עד כה ראינו כיצד אנו מסוגלים להביט בנתונים שבראש המחסנית
בלבד. נוכל גם להביט בנתונים הנמצאים בעומק המחסנית. לשם כך אנו נעזרים באוגר BP.
נביט בדוגמא הבאה:
STA SEGMENT STACK
DB 20 DUP (0)
STA ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STA
START:
MOV AX, CODE
MOV DS, AX
MOV AX, 31H
MOV BX, 32H
MOV CX, 33H
MOV BP, SP
PUSH AX
PUSH BX
PUSH CX
MOV DX, [BP-4]
MOV AH, 2
INT 21H
; End the program
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
לפני שאנו דוחפים נתונים למחסנית, אנו שומרים את ערכו של SP בתוך
האוגר BP.
לאחר שדחפנו נתונים לתוך המחסנית, ייתקיים כי [BP-1], [BP-2] מכילים את האיבר הראשון
שדחפנו למחסנית. [BP-3],
[BP-4] מכילים את
האיבר השני שדחפנו למחסנית, וכו'. בצורה כזו אנו מסוגלים לגשת לאיברים שדחפנו, לפי
סדר הכנסתם למחסנית.
העלמות הזין של יוסי הקוסם
יוסי יקיריאם הזין שלך נעלם בתוך מחסנית קסמים אני מקווה לפחות שאתה לא מתכוון לחבר את המחסנית לרובה דרוך
בשמחה שמעון הטבח