עבור לתוכן

פקודת push למחסנית-אסמבלי

Featured Replies

פורסם

מצורפת שאלה.

עלינו לממש קריאה לפונקציה בשם foo הכתובה ב- c עם ארגומנט אחד שערו 0x100fa500. מה הקוד שיבצע זאת נכון?

a)


sub esp,2
mov word[esp],0xa500
sub esp,2
mov word[esp] , 0x100f
call foo
add esp 4

d)


sub esp,2
mov word[esp],0x100f
sub esp,2
mov word[esp] , 0xa500
call foo
add esp,4

מדוע התשובה הנכונה היא d?(זו התשובה שמופיעה בפתרון המבחן)

לפי איך שיצא לי בסעיף a , המספר נכנס בדיוק כמוו שהוא היה נכנס עם פקודת push

וב- d דווקא לא.

תודה.go4qjdjm1drz.pnggo4qjdjm1drz.png

go4qjdjm1drz.png

פורסם

לדעתי זה תלוי ב-endianity. מעבדי אינטל עובדים ב-"little endian", שאומר שכל מספר שמוחזק בזכרון מוחזק בסדר בתים הפוך. כשאתה דוחף את כל 4 הבתים אז הבית שיושב במקום במקום הראשון הוא הבית התחתון ביותר (במקרה הזה 00), הבית במקום השני הוא זה שאחריו (A5) וכן הלאה. כלומר אם נסתכל על המחסנית, אז הבית 00 יישב הכי למטה, מעליו A5, וכן הלאה. לכן אם אתה דוחף קודם 2 בתים ואחר כך עוד 2 בתים, אז צריך לדחוף קודם כל את 2 הבתים העליונים, ולא התחתונים.

פורסם
  • מחבר

אני מסכים עם מה שאמרת בשתי שורות הראשונות

אבל עדיין לא ברור לי מדוע " לכן אם אתה דוחף קודם 2 בתים ואחר כך עוד 2 בתים, אז צריך לדחוף קודם כל את 2 הבתים העליונים, ולא התחתונים.".

האם אני טועה בציור?

המחסנית בשלב ראשון ב- a

a5

00

כש-00 בכתובת הגבוהה יותר

שלב שני ב- a :מוסיפים עוד למחסנית:

10

0f

a5

00

פורסם

המחסנית גדלה כלפי מטה, לא כלפי מעלה. שים לב שעל מנת להוסיף משהו למחסנית, עושים sub esp,2, דהיינו מחסירים 2 מהמחסנית, לא מוסיפים 2.

אם לדוגמה בתחילת הריצה esp=1000 אז ב-push הראשון יהיה esp=998, והבתים 00 ו-a5 ישבו במקומות 998 ו-999. אחרי ה-push השני, יהיה esp=996 והבתים 10 ו-0f ישבו במקומות 996 ו-997.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים