מבנה המחסנית

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



מאת: שמעון הטבח

העלמות הזין של יוסי הקוסם

יוסי יקירי
אם הזין שלך נעלם בתוך מחסנית קסמים אני מקווה לפחות שאתה לא מתכוון לחבר את המחסנית לרובה דרוך

בשמחה שמעון הטבח
מאת: הילה

si

היי, איך הכנסתם ערך כלשהו למערך? כשעשיתם MOV ARR2[SI], AL. למה si נמצא בסוגריים? מה הוא אומר?
מאת: יוסי הקוסם

העלמות זין

נעלם לי הזין מקסם שהשתבש (דחפתי את הזין למחסנית קסם וניראה לי שלא העברתי את הזין לטיפוס מילה הזיו שלי ללא ברית מילה אז זה השתבש)
תעזרו בבקשה!!!
שיתוף:
| עוד