לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #2  
ישן 09-01-2009, 16:27
  encoded encoded אינו מחובר  
 
חבר מתאריך: 22.06.06
הודעות: 87
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "איך התוכנה יודעת לזהות את סוג המשתנה? char, int וכד'"

ניראה שאתה שואל פה שתי שאלות שונות, אפילו יותר במבט אחר (או שלא הבנתי נכון)
כשאתה שולח מידע, הכל הוא string, למרות זאת, עד כמה שאני זוכר מישהו כתב ספרייה מיוחדת בשביל לשלוח דברים אחרים, כמו struct int long double וכ' (וגם הראו לינק אליה פה, חפש (: )

בקשר לזיכרון, זה הסיוט של כל מי שכתב disassembler לדעת לזהות מידע נכון, struct וכ', משתמשים בכל שיטות, חלק מהן זה heuristics ועוד כל מיני שאני לא ממש יודע עליהן.
מצד שני - זה גם מה שכל כך טוב, אין תבנית מסויימת,
לכן התשובה הפשוטה ביותר היא שאין דרך לדעת - צריך לדעת לנחש, להכיר את הקומפיילר וכך להבין איך הוא מייצג את המידע, צריך לקרוא internals docs (לדוג', של ׂGCC ) כדי להבין . יש הרבה מאוד מאמרים (חפש בגוגל ) על pattern matching ,
אם אין לך מה לעשות, תנסה לייצג מבנה מסויים ותראה איך כל קומפיילר מייצג אותו באסמבלר, זה ממש מגניב עם IDE (:

בקשר לתכנית, זה כבר משהו אחר לגמרי, כל פעם שאתה מקמפל תכנית, כלומר, לפני שהיא הופכת לexecutable היא עוברת הרבה מאוד שלבי ביניים, ופה זו הולכת להיות חפירה ענקית, אז אם לא בא לך לקרוא את זה ורק את התשובה הקצרה, תדלג על הפיסקה הזו
אני אקח את gcc כי אני משתמש בו הכי הרבה, אבל זה נכון כמעט לכל קומפיילר אחר שיצא לי להתקל בו (קלאסים כמו cl mingw וכ' וכ' וכ' )
ברגע שאתה מקמפל תכנית, הדבר הראשון שקורה הוא שתכנית ביניים שניקראת lexer עוברת על כל הקוד שלך ומתחילה לזהות מילות קישור, ומבנים
(לדוג'
קוד:
#include <stdio.h> /* This is just a comment */ // another comment! int main(int argc, char *argv[] ) { printf("A function was called! with %d args!\n",argc); return 0; }

)
ומעביר כל מידע שהוא יכול לטבלה, כל מילה מקבלת שם, ומספר, לדוג' argc
תקבל שם argc ומספר 1, יכולים להיות לה עוד פרמטרים שיווספו בעתיד, אבל זה הכל בינתיים.
במידה ואין שום שגיאה תחבירית (כי זה התפקיד של הlexer), הוא יוצר עץ זמני, שעם הזמן יקבל עוד ועוד צורה שבסופו של דבר ניקרא Abstract Syntax Tree , בכל שלב של הקימפול יווספו לו עוד ועוד פרמטרים חיוניים, כמו שמוסיפים לטבלה, למעשה, יש קומפיילרים שמעדיפים לא להוציא exectuable אלא AST , בגדול זה אותו הדבר.
השלב הבא שעומד לקרות הוא syntax analysis/parsing , שבעצם הופך ביטויים בעץ, או בקוד שלך ליותר קריאים, השלב הזה הוא אחד השלבים הכי קריטיים בקימפול, כל זאת אל תשכח, לפני בכלל שהתחלנו להוציא כל קוד שהוא אנחנו עדיין לא סיימנו לעבור על הקוד , בשלב הזה העץ שלך יקבל צורה הרבה יותר פרימטיבית ומובנת, הרבה יותר מידע יתווסף (לדוג', הסוג של המשתנים, איזה תכונות יש להם (public static protected, extern וכ' וכ' וכ' ) כמו כן כל המידע הזה ישמר בתוך הטבלה שאמרתי עליה מקודם שהיא
זמנית, השם האמיתי שלה הוא למעשה Symbol Table
בשלב הזה כל ה#define וה#include כבר מופו, אנחנו יודעים שהפונקציות קיימות ובכלל אנחנו יודעים שהקוד תקין ( תחבירית ), בשלב הזה הקומפיילר יתחיל שלב חדש, ובעצם יעביר את כל הקוד שלך לשפת ביניים ( Intermediate language ) , לרוב לשפה שדומה מאוד לאסמבלי, תלוי בקומפיילר, ובמפתח אני מניח, יש אנשים שמעדיפים לשלב על השלב הזה, בגדול, כל השלב הזה מתבסס על העץ שבנית מקודם והוא בעצם מתרגם אותו רק לדבר יותר נוח, יש שימשיכו את השלב הזה עוד יותר לאופטימיזציה (ועל זה אני לא אפרט כי זו חפירה מטורפת לדעתי ואני ממש לא בקיא בנושא הזה ) ואולי אפילו יכתבו שכבה מתחת, כלומר, Virtual Machine (כמו שיש לpython, perl, ruby, וכ' וכ' וכ'), אבל זה כבר שיקול של המתכנת, אחרי שעברנו את כל השלבים האלו הגענו לשלב האחרון - יצירת קוד אמיתי, אחרי שהכל באמת פועל ואין שום שגיאה - הקומפיילר יתחיל להעביר שורות מקוד הביניים לקוד אסמבלי אמיתי של הארכיטקטורה שלך (x86, amd, sparc, וכ' וכ' ) יקרא ללינקר (בהנחה שאנחנו מדברים על dynamic linking ), ויחבר את כל הספריות שלך (stdio, stdlibh) ויוציא exectuable ! ׁוככה הקומפיילר יודע איך משתנה קיים או לא (:


אם הגעת לפה זה אומר שאין לך ממש ראש לקרוא את כל החפירה הזו, אז בקצרה - בכל פעם שאתה מצהיר על משתנה הוא נשמר בטבלה ובכל שלב בקימפול נוסף לטבלה הזו עוד ועוד מידע על המשתנה, תלוי בשפה ובמתכנת איזה מידע, לרוב זה הסוג, (int, וכ' ), מספר שלו בטבלה (בשביל לאפשר שליפה מהירה זה לרוב hash table
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 10-01-2009, 17:46
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 2 שנכתבה על ידי encoded שמתחילה ב "ניראה שאתה שואל פה שתי שאלות..."

omg איזה סיפור

קראתי הכל, גם את החלק של החפירה כמובן, זה החלק המהותי. נשמע מעניין מאוד אבל מרתיע באותה מידה (כ"כ הרבה בלאגן...)

חשבתי שכל פקודה [ כלומר חלק של קוד שמסתיים בנקודה-פסיק ( ; ) ] מתחלקת לכמה פקודות ASM וזהו...

הכי התפלאתי מהקטע שצריך לנחש את המידע ( wtf? ). הרי חייב להיות מצב בו מידע יכול להיות מיוצג ע"י דברים שונים.
זה כמו לחפש מפתח במערך לפי ערך מסוים שיש במערך... הערך הזה יכול להופיע 500 פעם במערך באיבריו השונים, אבל המפתח יכול להיות קיים פעם אחת. ואז יש אפשרויות התאמה רבות ולא יודעים לאיזה איבר במערך להתייחס...

בשלב של האופטימיזציה, הקומפיילר יענו הופך ביטויים כמו:
קוד:
if (foo == 0)


לביטויים כמו:
קוד:
if (!foo)


מהבחינה של קוד האסמבלי?

ציטוט:
אם אין לך מה לעשות, תנסה לייצג מבנה מסויים ותראה איך כל קומפיילר מייצג אותו באסמבלר, זה ממש מגניב עם IDE (:


האם זהו ה- disassembler ? כלומר התוכנה שהופכת קוד מכונה לקוד אסמבלר?
יענו עם זה אתם מצליחים לדעת מהו קוד האסמבלי של תוכנית?
אבצע חיפוש והורדה, תודה.

בנוגע ל-GCC, הורדתי את זה (מקוה שהורדתי את הדבר הנכון) אבל לא הבנתי איך מפעילים את זה :s
יש לי gcc-4.3.2 אבל על איזה קובץ ללחוץ? אין אפילו readme שמדריך אותך :/
אז בסוף הורדתי ++Dev-C
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 10-01-2009, 23:06
  encoded encoded אינו מחובר  
 
חבר מתאריך: 22.06.06
הודעות: 87
בתגובה להודעה מספר 3 שנכתבה על ידי dorM שמתחילה ב "omg איזה סיפור ..."

ציטוט:
חשבתי שכל פקודה [ כלומר חלק של קוד שמסתיים בנקודה-פסיק ( ; ) ] מתחלקת לכמה פקודות ASM וזהו...

כן, זה נכון, אבל זה תהליך מאוד מייגע P: וארוך.
הקהילה עצמה של קומפיילרים מאוד קטנה (יחסית), ויש רק כמה מאוד גדולים וטובים (לדוג', הקומפיילר של אינטל, gnu compiler collection (gcc...) , visual studio ועוד ), אין הרבה אנשים שמצליחים לכתוב טכניקות חדשות או דברים חדשים בנושא, וזה מאוד מקשה על העניין (אבל כאן אני אכנס לחפירה אחרת אם אתה מעוניין לקרוא עוד על זה חפש בגוגל את
ציטוט:
Compilers: Principles, techniques & tools
של Aho , אחד הספרים הכי מעניינים וטובים שקראתי בנושא, וגם את
ציטוט:
Crenshaw's let's write a compiler!
(בפסקל, אבל עדיין מגניב))


ציטוט:
הכי התפלאתי מהקטע שצריך לנחש את המידע ( wtf? ). הרי חייב להיות מצב בו מידע יכול להיות מיוצג ע"יי דברים שונים.

שוב, זה לא ממש לנחש, אל תשכח שכל טיפוס עדיין מיוצג בדברים שדיי קלים לייצוג (32בייט, 16, ועד ביט אחד), יש הרבה מאוד שיטות שרובן עד כמה שאני זוכר משתמשות בהיריסטיקה (אני לא בטוח שאני כתבתי את נכון אפילו), או אפילו כותבים parser בשביל שיזהה את המידע עצמו
וישווה אותו עם case studies שיהיו טיפוסיים. אתה תיראה שזה מאוד קל לזהות לדוגמא float נגד int בגלל floating point exception וכל מיני שטויות אחרות

ציטוט:
זה כמו לחפש מפתח במערך לפי ערך מסוים שיש במערך... הערך הזה יכול להופיע 500 פעם במערך באיבריו השונים, אבל המפתח יכול להיות קיים פעם אחת. ואז יש אפשרויות התאמה רבות ולא יודעים לאיזה איבר במערך להתייחס...

אני לא ממש הבנתי למה אתה מתכוון, אבל שוב - זה קשה, זה סיוט, יכולים להיות התנגשויות -כן, אין ספק, אבל עדיין מצליחים לזהות טיפוסים שונים. לרוב ע"י המשתמש, ולא המתכנת, כלומר אם לדוג' בgdb - אתה תזהה בעצמך סטרינג ותייצג אותו עם x/s $0xaddress ולא x/i $0xaddress , או שתנסה את שניהם ותיראה מה יותר הגיוני, שוב - יש מצב ששניהם יתאימו וזה ידרוש עוד התאמה וניתוח, אבל עדיין זה קטע של הבנה מה יותר הגיוני.


ציטוט:
בשלב של האופטימיזציה, הקומפיילר יענו הופך ביטויים כמו:
קוד:
if (foo == 0)
לביטויים כמו:
קוד:
if (!foo)
מהבחינה של קוד האסמבלי?

לא, שלב האופטימיזציה זה שלב שבא אחרי שהתחלנו להפיק קוד שניראה דומה לאסמבלר, ואם ניקח דוגמא - למשל, יש לך את הקוד
קוד:
i = i + 1;

הוא לא יעשה
קוד:
add i,1

אלא
קוד:
inc i


ציטוט:
האם זהו ה- disassembler ? כלומר התוכנה שהופכת קוד מכונה לקוד אסמבלר?
יענו עם זה אתם מצליחים לדעת מהו קוד האסמבלי של תוכנית?
אבצע חיפוש והורדה, תודה.

כן, זה disassembler, הינה כמה ממש טובים : (לינוקס/ווינדוז):
http://www.eresi-project.org/ [זה בכלל פרוייקט ממש מושקע, חלק מהאדמינים עשו חלקים ממנו לתזה שלהם בתואר]
http://www.gnu.org/software/gdb/
http://www.kdbg.org/
http://www.microsoft.com/whdc/DevTo...ng/default.mspx
http://en.wikipedia.org/wiki/DTrace
יש עוד הרבה מאוד, כמו ollydbg שהוא מאוד קלאסי (וגם בה עם קוד מקור, מה שיותר שווה),
קשה למצוא היום דיסאסמבלר שהוא חופשי וגם טוב, IDE הוא אחד הטובים מבחינת דיקומפיילר (כלומר - מבצע גם ניתוח, ולא העברת של קוד מכונה לאסמבלר חופשי), אבל הוא לא קוד פתוח, kdbg הוא אחד הטובים וגם קוד פתוח, אפשר ללמוד ממנו הרבה מאוד.
אם יצא לך להסתכל בסורס (ואחרי יום או יומיים אתה תראה שזה לא קשה כזה להבין), אתה תראה שרוב הדיקומפיילרים מאוד דומים - קוראים את הקובץ לבאפר, ומתחילים לעבור עליו - בכל פעם שאוספים מספיק מידע - מוציאים את זה למבנה אחר.
מה ששונה מכל אחד הוא דרך הייצוג שלהם למבנה שיצא, או שיכנס. כדי להבין איך הם עוברים עליו אני מאוד מציע לך את intel architecture documentation [שאני אישית הדפסתי אותו בבצפר P: [ זה לא הרבה דפים, בערך 30 כל השאר זה סתם דברים שלא צריך כדי להבין את הקוד] ]


ציטוט:
בנוגע ל-GCC, הורדתי את זה (מקוה שהורדתי את הדבר הנכון) אבל לא הבנתי איך מפעילים את זה :s
יש לי gcc-4.3.2 אבל על איזה קובץ ללחוץ? אין אפילו readme שמדריך אותך :/
אז בסוף הורדתי ++Dev-C

אתה יודע שאתה צריך לקמפל אותו כדי להריץ, כן ? זה מאוד מייגע לדעתי לקמפל דבר כזה, אני מאוד ממליץ לך להוריד אחד עם package manager שהוא
אין על dev-cpp אם יותר נוח לך אפילו תשתמש בVS , כל אחד מה שהוא אוהב, הדבר היחיד שיהיה שונה זה האסמבלר, לפעמים הwarnings (אבל אלה דברים שאתה לא צריך )

---
עריכה וטיפה חפירה,
רק בשביל לתת טיפה עוד מידע, למי שלא יודע, הקוד עצמו לרוב לא נמצא במבנה ישיר, וחלק, flat במונחים טכניים, וזה ממש סיוט - תלוי בקומפיילר, וכאן זה סיוטו של כל כותב דיקומפיילר - להתחיל לנתח איפה הקוד מתחיל ואיפה הוא נגמר, VS עושה הרבה מאוד רעש למתכנת ולדבג תכנה כזו תהיה מאוד סיוט. כמו כן כל הקומפיילרים שואפים שיהיה alignment כך שרוב הפעמים אתם תראו שהגישה לebp/esp היא מאוד נורמאלית, ולפעמים משתנים שלוקחים 2 בתים לפעמים יקחו 6 או שמונה, תלוי בקומפיילר, בגירסא, וכ' (gcc הוסיפו ב2005/6 ערך canary לדוג', ב2007 הם הוסיפו הגנה אוטומטית לstack frames שלהם, שימוש שונה ברגיסטרים (הם אף פעם לא השתמשו בedx לדוג' לצרכים כאלו עד עכשיו))

---
עוד דבר, אחד ואחרון, מבטיח
gcc הוא לא רק קומפיילר לC , מה שהופך את הקוד שלו למאוד מסורבל ולא נקי, לכן אם איי פעם תנסה לעשות לו דיסאסמבלינג אתה תראה שזה מאוד קשה להבין אפילו איך הוא מתחיל (כלומר, מ .init / _init _ start וכ' ), הוא מוסיף הרבה מאוד sections (איך כותבים את זה בעברית?), שזקוקים לשפות אחרות כמו פורטראן וכ'.
יאללה, סיימתי.

נערך לאחרונה ע"י encoded בתאריך 10-01-2009 בשעה 23:28.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 11-01-2009, 13:01
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 4 שנכתבה על ידי encoded שמתחילה ב "[quote]חשבתי שכל פקודה [..."

ניסיתי להבין כמה שאפשר אבל אני לא חזק בזה מספיק

כמה צריך ללמוד כדי לדעת את כל זה? (י"ג, י"ד במכללה או תואר ראשון וכד'?) וגם איזה מקצועות... כי אני יודע שיש הנדסת תוכנה ומנגד יש גם מדעי המחשב שהם דברים די שונים.

ציטוט:
אתה יודע שאתה צריך לקמפל אותו כדי להריץ, כן ? זה מאוד מייגע לדעתי לקמפל דבר כזה, אני מאוד ממליץ לך להוריד אחד עם package manager שהוא
אין על dev-cpp אם יותר נוח לך אפילו תשתמש בVS , כל אחד מה שהוא אוהב, הדבר היחיד שיהיה שונה זה האסמבלר, לפעמים הwarnings (אבל אלה דברים שאתה לא צריך )

אני צריך לקמפל בעצמי? Oo
למה לא הביאו את זה מקומפל מראש...?
כנראה עדיף כבר להישאר עם Dev-C .. ד"א מה המשמעות של Dev? אפילו בויקי אין על זה מידע...

תודה על ההשקעה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 09-01-2009, 17:09
  משתמש זכר eXtruct eXtruct אינו מחובר  
 
חבר מתאריך: 27.10.05
הודעות: 1,067
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "איך התוכנה יודעת לזהות את סוג המשתנה? char, int וכד'"

כל הטיפוסים זה הפשטה שלך יהיה יותר נוח לתכנת, מעבד לא מבדיל ביניהם בשבילו כולם אחדות ואפסים, אז אין בכל זאת זה מתבצע? במקור המעבד עובד עם ביטים, בשביל לדעת כמה ביטים לקחת (מה שאנחנו מבינים כמו INT, CHAR וכו') קיימות פעולות של קאסטינג:
לדוגמא:
הפעולה הזאתי
קוד:
int a = 10;

אצלי הפכה לקוד אסמבלי הבא:
קוד:
mov DWORD PTR [ebp-0x8], 0xa

DWORD PTR משמעותו DOUBLE WORD פוינטר כלומר מכניסים למכניס בכתובת EBP - 8 את הערך 10 שגודלו 4 ביתים!

עוד אחד
קוד:
char a = 10;

הופך ל
קוד:
mov BYTE PTR [ebp-0x5], 0xa

ופה מכניסים ל EBP - 5 רק בית אחד שערכו 10.

ודוגמא אחרונה:
קוד:
char a = 10; int b = 5; a = b;


קוד:
mov BYTE PTR [ebp-0x9],0xa mov DWORD PTR [ebp-0x8],0x5 mov eax,DWORD PTR [ebp-0x8] mov BYTE PTR [ebp-0x9],al

בהתחלה EBP-9 מקבל ערך 10 ותופס 4 תאים בזכרון! (כלומר זכרון אתה תראה 00 00 00 0A)
עכשיו EBP - 8 מקבל ערך 5 ותופס תא אחד! (זכרון = 05)
עכשיו לאוגר EAX שגודלו 4 ביתים מעבירים מידע מ EBP-8 ומבצעים CASTING ל DWORD PTR
(לא ללמדו על אוגרים מורחים (EXX) במכללה אני רק יודע שהם 4 ביתים במקום 2 ואני לא יודע אם יש לכל אחד מהם LOW ו HIGH [אני יודע ש AX מתפצל ל AL ו AH])
ועכשיו ל EBP-9 (אותה כתובת בה יושב A שלנו שערכו 10) מכניסים את התוכן של AL (שזה החלק הנמוך (LOW) של AX) שערכו 5 ומבצעים CASTING ל BYTE ובכך משכתבים את התא שמלא באיור למאלה ומקבלים 00 00 00 05 (במקום 0A שהיה).
הבנת?
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 10-01-2009, 18:00
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 7 שנכתבה על ידי eXtruct שמתחילה ב "כל הטיפוסים זה הפשטה שלך יהיה..."

כן תודה

בפיסקה האחרונה אני מניח שקצת התבלבלת (תקן אותי אם אני טועה) כי זה היה קצת לא הגיוני, אנסה לכתוב הסבר בעצמי (ואז תוכל לראות שהבנתי, וגם אעשה את התיקון):

זה קוד ה-ASM של קוד ה-C:
קוד:
mov BYTE PTR [ebp-0x9],0xa mov DWORD PTR [ebp-0x8],0x5 mov eax,DWORD PTR [ebp-0x8] mov BYTE PTR [ebp-0x9],al


המשתנה בקוד ה-C ששמו a, נכנס לתא\בית שבכתובת "ebp-0x9", וערכו הוא 0xa.
המשתנה בקוד ה-C ששמו b, נכנס לתאים המתחילים בכתובת "ebp-0x8" ואורך הנתון הוא 4 תאים\בתים, וערכו הוא 0x5 (כל שאר התאים הם אפסים). החלק הזה לא הגיוני ממש כי אחרי התא "ebp-0x8" מגיע התא "ebp-0x9" ואז התא הזה אמור להתאפס, אבל התא הזה בכלל תפוס ע"י משתנה a...

אח"כ (שורה שלישית) מתבצעת העברת מידע בגודל 4 בתים (Double Word), מהכתובת "ebp-0x8" לאוגר eax שגודלו גם כן 4 בתים (הגדלים חייבים להיות דומים עד כמה שאני יודע בנוגע לאסמבלי).

ולבסוף בשורה אחרונה, לוקחים את המידע מאוגר al (שזה החלק הנמוך של אוגר eax, כלומר 2 בתים תחתונים), מבצעים לו casting לגודל של בית אחד, ומכניסים לתא בכתובת "ebp-0x9".
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 10-01-2009, 18:51
  משתמש זכר eXtruct eXtruct אינו מחובר  
 
חבר מתאריך: 27.10.05
הודעות: 1,067
בתגובה להודעה מספר 8 שנכתבה על ידי dorM שמתחילה ב "כן תודה :D בפיסקה האחרונה..."

אני לא יודע כמה זכרון מוקצא מראש לתוכנית שלנו אבל אני כן יודע איך הוא נראה:
נניח קיבלנו 1024ביתים לתוכנית שלנו (בשביל לפשט דברים אני מתייחס לכתובת הנמוכה ביותר כ 0 ולגבוהה ביותר ב 1023), הסגמנט הראשון יתחיל בכתובת 0 והוא נקרא DATA SEGMENT, גודלו ידוע מראש והוא ניתן לשינוי, בתוך סגמנט זה נשמרים כל הקבועים אשר לא מאופסים, לדוגמא המחרוזת הבאה:
קוד:
char s[] = "C Rulezz";

תיכנס ל DATA סגמנט כי גודלה ידוע מראש, ונצא מהנחה שזה הקבוע היחידי בתוכנית שלנו ולכן אנחנו מקבלים את הסגמנט הראשון שהוא DATA.
אחרי DATA מגיע BSS סגמנט אשר שומר את כל הקובעים אשר הוגדרו ל 0, לדוגמא:
קוד:
static int myZeroInt;

ישב ב BSS סגמנט.
עכשיו כעיקרון אמור לבוא CODE SEGMENT אשר בעצם מכיל אל קוד, לפי ויקיפדיה לא ממשר ברור איפה יושב הקוד הזה, ויקיפדיה אומרת שהוא מגיע עוד לפני ה DATA סגמנט, אם יש מישהוא שיכול לתקן אותי בקטע הזה אני אשמח.
אחרי זה מגיע ה HEAP אשר מכיל את כל ההקצאות הדימנימות שנעשו בתוכנית: עם יש לך משתנה אשר הוקצא לו מקום עם MALLOC הוא ישב ב HEAP.
עכשיו נניח שה HEAP מתחיל בכתובת 500. הה HEAP הולך וגדל לעבר 1024.
אחרי ה HEAP מגיע ה STACK סגמנט אשר מכיל את כל המשתנים הלוקליים של התוכנית, וכמו כן כתובת (ואם יש צורך אז גם סגמנט) חזרה מפונקציות. !אבל! בגלל שגודל הה HEAP לא ידוע מראש ה STACK לא יכול להתחיל ישר אחרי ולכן ה STACK מתחיל בכתובת 1023 וגדל לעבר 0! ולכן אם ה STACK ריק ה TOP שלו יהיה ב 1023, אם יש בו בית אחד ה TOP יהיה ב 1022 וכו'.

עכשיו EBP לרוב מצביע ל ESP שהוא מצביע ל TOP של ה STACK, אז אם נצייר סכמטית:
קוד:
| CODE SEG | DATA SEG | BSS SEG | HEAP-> | <- STACK|

עכשיו נניח EBP מצביע ל 100, EBP-9 יצביע ל 91. EBP - 8 יצביע ל 92 בגלל שה STACK הולך ו"קטן" ה TOP תמיד יהיה נמוך מ ה TOP הקודם ולכן אם נחלק את ה INT שלנו שהוא 5 בתוך ה STACK הוא יכנס ככה:
קוד:
00 00 00 05 0A ebp-5 ebp-6 ebp-7 ebp-8 ebp-9


חוץ מזה אני מסכים איתך בכל חוץ מהחלק האחרון ש AL זה 2 בית של EAX, שוב לא עבדתי עם אוגרים מורחבים EXX אבל אני עדיין דיי בטוח ש AL זה החלק הנמוך של AX ולכן הוא בית אחד ולא 2.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 10-01-2009, 20:51
  Incred2 Incred2 אינו מחובר  
 
חבר מתאריך: 03.01.09
הודעות: 239
בתגובה להודעה מספר 8 שנכתבה על ידי dorM שמתחילה ב "כן תודה :D בפיסקה האחרונה..."

ציטוט:
במקור נכתב על ידי dorM
המשתנה בקוד ה-C ששמו a, נכנס לתא\בית שבכתובת "ebp-0x9", וערכו הוא 0xa.
נכון


ציטוט:
במקור נכתב על ידי dorM
המשתנה בקוד ה-C ששמו b, נכנס לתאים המתחילים בכתובת "ebp-0x8" ואורך הנתון הוא 4 תאים\בתים, וערכו הוא 0x5 (כל שאר התאים הם אפסים). החלק הזה לא הגיוני ממש כי אחרי התא "ebp-0x8" מגיע התא "ebp-0x9" ואז התא הזה אמור להתאפס, אבל התא הזה בכלל תפוס ע"י משתנה a...
לא נכון
המשתנה לוקח את הזיכרון שמ- ebp-0x8 עד ebp-0x5[/QUOTE]

ציטוט:
במקור נכתב על ידי dorM
אח"כ (שורה שלישית) מתבצעת העברת מידע בגודל 4 בתים (Double Word), מהכתובת "ebp-0x8" לאוגר eax שגודלו גם כן 4 בתים (הגדלים חייבים להיות דומים עד כמה שאני יודע בנוגע לאסמבלי).
נכון

ציטוט:
במקור נכתב על ידי dorM
ולבסוף בשורה אחרונה, לוקחים את המידע מאוגר al (שזה החלק הנמוך של אוגר eax, כלומר 2 בתים תחתונים), מבצעים לו casting לגודל של בית אחד, ומכניסים לתא בכתובת "ebp-0x9".
לא נכון
al זה החלק הנמוך של ax ( השני הוא ah ) .ו-ax הוא החלק הנמוך של eax ( לחלק הגבוה אין שם ).זאת אומרת שלוקחים חצי מחצי מ-DWORD שזה בייט אחד ,ואין שום CAST .
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 19:35

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר