פורסם 2012 ביולי 113 שנים מצורפת שאלה. עלינו לממש קריאה לפונקציה בשם foo הכתובה ב- c עם ארגומנט אחד שערו 0x100fa500. מה הקוד שיבצע זאת נכון? a) sub esp,2mov word[esp],0xa500sub esp,2mov word[esp] , 0x100fcall fooadd esp 4 d) sub esp,2 mov word[esp],0x100f sub esp,2 mov word[esp] , 0xa500call fooadd esp,4 מדוע התשובה הנכונה היא d?(זו התשובה שמופיעה בפתרון המבחן) לפי איך שיצא לי בסעיף a , המספר נכנס בדיוק כמוו שהוא היה נכנס עם פקודת push וב- d דווקא לא. תודה.
פורסם 2012 ביולי 113 שנים לדעתי זה תלוי ב-endianity. מעבדי אינטל עובדים ב-"little endian", שאומר שכל מספר שמוחזק בזכרון מוחזק בסדר בתים הפוך. כשאתה דוחף את כל 4 הבתים אז הבית שיושב במקום במקום הראשון הוא הבית התחתון ביותר (במקרה הזה 00), הבית במקום השני הוא זה שאחריו (A5) וכן הלאה. כלומר אם נסתכל על המחסנית, אז הבית 00 יישב הכי למטה, מעליו A5, וכן הלאה. לכן אם אתה דוחף קודם 2 בתים ואחר כך עוד 2 בתים, אז צריך לדחוף קודם כל את 2 הבתים העליונים, ולא התחתונים.
פורסם 2012 ביולי 113 שנים מחבר אני מסכים עם מה שאמרת בשתי שורות הראשונותאבל עדיין לא ברור לי מדוע " לכן אם אתה דוחף קודם 2 בתים ואחר כך עוד 2 בתים, אז צריך לדחוף קודם כל את 2 הבתים העליונים, ולא התחתונים.".האם אני טועה בציור?המחסנית בשלב ראשון ב- aa500 כש-00 בכתובת הגבוהה יותרשלב שני ב- a :מוסיפים עוד למחסנית:100fa500
פורסם 2012 ביולי 113 שנים המחסנית גדלה כלפי מטה, לא כלפי מעלה. שים לב שעל מנת להוסיף משהו למחסנית, עושים sub esp,2, דהיינו מחסירים 2 מהמחסנית, לא מוסיפים 2.אם לדוגמה בתחילת הריצה esp=1000 אז ב-push הראשון יהיה esp=998, והבתים 00 ו-a5 ישבו במקומות 998 ו-999. אחרי ה-push השני, יהיה esp=996 והבתים 10 ו-0f ישבו במקומות 996 ו-997.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.