פקודות מיותרות אחרי שמשתנים אצלי מקבלים ערכים?

עמוד

ברוכים הבאים לאתר תחרויות קודגורו! פורומים אקסטרים פקודות מיותרות אחרי שמשתנים אצלי מקבלים ערכים?

מוצגות 10 תגובות – 1 עד 10 (מתוך 10 סה״כ)
  • מאת
    תגובות
  • #76779
    nopsled
    משתתף

    הי כתבתי קוד בשפת סי שמכניס ערכים לארבעה משתנים
    הנה האסמבלי אחרי תרגום:

    push ebp
    mov ebp, esp
    push ecx
    push ebx
    push esi
    push edi
    xor eax, eax
    mov [ebp + var_4], eax
    mov ebx,1
    mov esi,2
    mov edi,3
    push esi
    push ebx
    call sub

    אני לא מבינה למה יש לי את שני ה PUSH בסוף התוכנית
    push esi
    push ebx
    הרי כבר שמנו אותם במחסנית והם קיבלו ערכים אז למה זה הוסיף לי את הפקודות האלו כשתרגמתי לאסמבלי?
    ואם כבר כן צריך את זה עוד פעם אחרי שהכנסתי ערך אז למה שתי פקודות כאלו ולא שוב את כל הארבע?

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

    #77977
    CodeGuru
    מנהל בפורום

    שלום nopsled (איזה שם נחמד),
    דחיפת המשתנים לפני הקריאה היא לא על מנת לשמור את ערכם, אלא כדרך להעביר פרמטרים לפונקציה.
    ראי, למשל, סעיף 8.2.1.4
    http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html

    עודד

    #77976
    nopsled
    משתתף

    עכשיו הבנתי את זה וגם את היצירה של ה FRAME
    שתי הפקודות הראשונות שלא הבנתי
    זה באמת מסתדר כי הפונקציה מקבלת שתי פרמטרים שאלו באמת המשתנים עם הערכים שלהם
    יש לי בהתחלת ה MAIN
    הגדרה של הארבעה משתנים
    אפשר גם הסבר למה יש לי את הפקודות האלו:
    push ecx
    push ebx
    push esi
    push edi

    מה היה קורה אם הייתי מגדירה 100 משתנים אין לי מספיק אוגרים
    השאלה היא האם צריך לעשות PUSH למשתנים שיש לי ב MAIN
    אפילו אם אין להם עדיין ערך
    האם זה תמיד יהיה בהתחלה של תוכנית
    או איפה יש קישור כמו שהבאת שהסביר טוב גם על הארבע פקודות האלו.

    ושאלה אחרת אם אפשר
    איך אני יכולה לקבל מה האופקוד של פקודה שיש לי
    למשל LEAVE זה אופקוד של
    0xC9
    איך אני יכולה לעשות המרה עם אתר או משהו נוח לאופקוד שמתאים לפקודה?

    יש את ה PDF הזה שהביאו לי
    http://net.cs.uni-bonn.de/fileadmin/user_upload/plohmann/x86_opcode_structure_and_instruction_overview.pdf
    הפקודה של RET
    תופסת שתי מקומות גם של 2 וגם של 3
    אז נראה לי שהגיוני שזה יהיה 2 אבל אני רוצה להיות בטוחה

    ואיך מוצאים ב PDF הזה את האופקוד של INC?
    זה מתחיל ב 4
    אבל יש לו את הספרה השניה מ 0 עד 7

    #77975
    CodeGuru
    מנהל בפורום

    פקודות המחסנית שציינת הם שמירה "רגילה" של ערכי אוגרים. הקומפילר יכול לשים חלק מהמשתנים באוגרים אבל במקור לכל אחד מהם יש שטח זכרון משלו.

    אני מאוד אוהב את הדף (שני עמודים) המתומצת הזה
    http://www.jegerlehner.ch/intel/IntelCodeTable.pdf
    הוא אמנם לא מכיל את ערכי ההקסה של הפקודות, אותם אפשר למצוא ב
    Debug
    או באתר
    http://www.mlsite.net/8086/
    אותו והרבה אחרים אפשר למצוא בדף הקישורים הזה
    http://cs.haifa.ac.il/courses/com_org_etgar/web/references.html

    לשאלתך
    40 = INC AX
    41 = INC CX
    42 = INC DX
    43 = INC BX
    44 = INC SP
    45 = INC BP
    46 = INC SI
    47 = INC DI
    והשאלה השניה
    C2 = RET N
    C3 = RET

    #77974
    nopsled
    משתתף

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

    למשל אני שולחת פה שני פרמטרים לפונקציה אז הייתי יכולה בעצם אם כבר להכניס רק שני משתנים למחסנית
    אני קוראת אחכ לפונקציה שלוקחת ארבעה פרמטרים
    אז בגלל שאני ב MAIN אני מכניסה על ההתחלה את כל המשתנים שאני מגדירה כדי שהיו זמינים לכל הפונקציות?

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

    ואם יש שמירה "רגילה" יש גם שמירה "לא רגילה" אז מה זה שמירה לא רגילה?

    ואין ב PDF את האוגרים האלו מה שאמרת עם ה INC
    אז אני מניחה שאם יש לי כמה ריבועים אז בהתאם לכמות הריבועים אני לוקחת את האוגרים בסדר שאתה כתבת, נכון?

    ויופי RET זה 0xC3 אני חושבת שחיפשתי כבר כמה ימים איך אני מוצאת מה הערך שלו כי מצאתי שגיאה בספר באינטרנט שכתבו שם שגם LEAVE וגם RET הם 0xC9
    אולי צריך לקחת את ה PDF שלך ולהככניס בו גם את ה OPCODEים ואז הוא יהיה הכי טוב מכולם.

    מצטערת אם יצא לי לחפור יותר מידי אבל נראה לי שזה חשוב כי זאת תוכנית ראשונה וזה הבסיס לכל תוכנית אחרת

    י

    #77973
    nopsled
    משתתף

    והנה תראה פה ש RET הוא C3
    באסמבלי 8086
    http://cs.lmu.edu/~ray/notes/x86encode/

    RET C3 [8086]
    RET imm16 C2 iw [8086]
    RETF CB [8086]
    RETF imm16 CA iw [8086]
    RETN C3 [8086]
    RETN imm16 C2 iw [8086]

    מה בכלל ההבדל בין RET וה RET N
    זה לא אותה פקודה כי זה אופקודים שונים

    #77972
    nopsled
    משתתף

    סליחה התכוונתי ש RETN הוא גם C3
    ולא C2

    #77971
    nopsled
    משתתף

    ויש לי את ה
    push ebp
    mov ebp, esp
    ב MAIN כי ה MAIN הוא פונקציה לכל דבר אז גם הוא צריך יצירה של STACK
    ואת הפקודוהת האלו גם
    נכון?

    #77970
    CodeGuru
    מנהל בפורום

    ב"רגילים" התכוונתי לשמירה במחסנית של ערך של אוגר כדי שאפשר יהיה להשתמש בו למשהו אחר ואז הוצאה ממנה חזרה של הערך המקורי. למשל דוגמא 7.7 בעמוד 276 בספר של האוניברסיטה הפתוחה
    cse.proj.ac.il/asembli/st-book-pdf.pdf
    חייבים לשמור במקרה שצריך את הערך המקורי אחר כך, אבל קומפילרים שומרים הכל בכל מקרה כי לפעמים קשה לדעת האם הערך ישתנה ואו האם נזדקק לערך הישן בעתיד. לעיתים אופטימיזציה טובה יכולה להשמיט פקודות אלו.
    בדרך כלל יש רק מחסנית אחת (צריך לעשות פעולות מיוחדות כדי לייצר יותר מאחת). הפקודות
    push ebp
    mov ebp, esp
    נועדו לשמור על מצב המחסנית ולשחזר אותה בסוף השגרה על ידי זוג הפקודות
    mov  esp, ebp
    pop  ebp

    RET
    הוא לחזור משגרה. האסמבלי מתרגם אותו ל
    Return Near או Return Far
    בהתאם לסוג השגרה
    Call או Call Far

    #77969
    nopsled
    משתתף

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

מוצגות 10 תגובות – 1 עד 10 (מתוך 10 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.