מיעון מבוסס היסט
-
זה לא תחום שאני בקי בו, התשובה הבסיסית היא ככה:
צריך להבחין בין מיעון שהוא יחסי לבסיס כלשהו סתמי לבין מיעון יחסי ל-RIPמיעון מבוסס היסט סתמי הוא צורך מאוד נפוץ, זה נועד כדי לאפשר גישה קלה לשדה בתוך מבנה נתונים
דוגמה:
נגיד יש לך איזה שירות ענן כלשהו (SaaS בלע"ז), אז יש משתשמים במערכת ולכל משתמש יש קרדיטים שהוא קונה כדי להשתמש במערכת. אז יש לך מבנה נתונים שמייצג לקוח. המבנה הזה הוא עם כמה שדות, יש שדה של שם, גיל, מספר קרדיטים במערכת, ורמת הרשאה.
ואז מסביב אתה כותב פונקציות עזר, למשל פונקציה שיוצרת לקוח חדש מארגומנטים, עוד פונצקיה שמעדכן את רמת ההרשאות ועוד אחד שמעדכן את מספר הקרדיטים במערכת.
אז הפונקציה שמעדכנת את מספר הקרדיטים, היא מקבלת כארגומנט את הכתובת של אובייקט הלקוח, והפונקציה צריכה לגשת להיסט מסויים בתוך המבנה כדי לעדכן את הערך שנמצא שם
מכיון שזה צורך כל כך נפוץ, יצרו פקודות מיוחדות לגשת בצורת בסיס+היסט במקום להשתמש בפקודות הרגילות של חיבור כי ככה יוצא קוד בינארי יותר קטן וגם זה הפקודה יותר יעילה מאשר לעשות בעצמך את הפעולה המתמטית של חישוב הבסיס+ההיסט ולשמור את זה בעוד אוגר ואז לגשת לתוצאהלגבי מיעון שהוא יחסי ל-RIP, זה סיפור קצת שונה:
הצורך בזה הוא כדי לבנות ספריות נטענות (DLL-ים בווינדוס או shared objects בלינוקס) בצורה שאפשר להטעין אותם לכל מקום בראם בלי לעבור על כל הכתובות ולעדכן אותם (מה שנקרא Position Independent Code או PIC)
הסבר:
בהרבה ספריות יש בנוסף לאוסף של פונקציות, גם צורך לשמור ולגשת לדאטה גלובלי כלשהו, אם הכתובת של המשתנה הגלובלי הזה יהיה קבוע, אי אפשר יהיה לטעון את הספרייה לכל מיקום בזכרון בלי לעדכן כל מקום שניגש למשתנה הגלובלי הזה, לכן המציאו אפשרות לגשת למיקום שהוא יחסי ל-RIP ככה בכל כתובת שתטען את הספרייה הקוד יעבוד
אגב, בלי אפשרות זו, לא היה אפשר לעשות את זה עם פקודות מתמטיות, כי אין גישה ישירה לערך של RIP -
@yossiz אגב , בקוד הזה:
global main extern GetStdHandle extern WriteConsoleA extern ExitProcess section .bss buffer resb 8 written resd 1 section .text main: push r12 push r13 sub rsp, 40 mov eax, 10000 lea rdi, [rel buffer+7] mov byte [rdi], 10 dec rdiלמה מחסרים 1 מRDI?
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות