ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › פקודות מיותרות אחרי שמשתנים אצלי מקבלים ערכים?
- This topic has 9 תגובות, 2 משתתפים, and was last updated לפני 11 שנים, 7 חודשים by CodeGuru.
-
מאתתגובות
-
28 במרץ 2013 בשעה 18:09 #76779nopsledמשתתף
הי כתבתי קוד בשפת סי שמכניס ערכים לארבעה משתנים
הנה האסמבלי אחרי תרגום: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
הרי כבר שמנו אותם במחסנית והם קיבלו ערכים אז למה זה הוסיף לי את הפקודות האלו כשתרגמתי לאסמבלי?
ואם כבר כן צריך את זה עוד פעם אחרי שהכנסתי ערך אז למה שתי פקודות כאלו ולא שוב את כל הארבע?ולא נוח לכתוב כאן הודעות
גם החלון קטן נורא וגם אין אפשרות להדגיש טקסט או שהעברית אנגלית לא מסתדרת29 במרץ 2013 בשעה 01:39 #77977CodeGuruמנהל בפורוםשלום nopsled (איזה שם נחמד),
דחיפת המשתנים לפני הקריאה היא לא על מנת לשמור את ערכם, אלא כדרך להעביר פרמטרים לפונקציה.
ראי, למשל, סעיף 8.2.1.4
http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.htmlעודד
29 במרץ 2013 בשעה 14:39 #77976nopsledמשתתףעכשיו הבנתי את זה וגם את היצירה של ה 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 עד 730 במרץ 2013 בשעה 13:48 #77975CodeGuruמנהל בפורוםפקודות המחסנית שציינת הם שמירה "רגילה" של ערכי אוגרים. הקומפילר יכול לשים חלק מהמשתנים באוגרים אבל במקור לכל אחד מהם יש שטח זכרון משלו.
אני מאוד אוהב את הדף (שני עמודים) המתומצת הזה
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 = RET30 במרץ 2013 בשעה 22:50 #77974nopsledמשתתףכלומר אני בעצם מגדירה משתנים בתחילת התוכנית.
באמת יש לי פה ארבעה משתנים שאני מגדירה
ואז תמיד צריכה לדחוף אתם למחסנית?
זה הכרחי?
ומצטערת אני עדיין לא מבינה מה זה שמירה רגילה של ערכי האוגרים
כי יש לי משתנים או אוגרים, אני שמה בהם ערך ואז דוחפת אותם בתור פרמטרים לפונקציה ועושה CAL (את החלק האחרון הסברת ממש טוב והבנתי נהדר באמת תודה לך).
אז אם יש לי ערכים והם מגיעים לפונקציה אז למה צריך לעשות להם PUSH אם בכל מקרה יהיה PUSH למה שבאמת הפונקציה שאליה אני מגיעה צריכהלמשל אני שולחת פה שני פרמטרים לפונקציה אז הייתי יכולה בעצם אם כבר להכניס רק שני משתנים למחסנית
אני קוראת אחכ לפונקציה שלוקחת ארבעה פרמטרים
אז בגלל שאני ב MAIN אני מכניסה על ההתחלה את כל המשתנים שאני מגדירה כדי שהיו זמינים לכל הפונקציות?עוד שאלה – איך הם יכולים להגיע למשתנים האלו? הרי לכל פונקציה יש מחסנית משלה נכון? איך הם מדלגים מהפונקציות אחכ לארבעה משתנים שהכנסתי על ההתחלה בתוכנית הראשית?
ואם יש שמירה "רגילה" יש גם שמירה "לא רגילה" אז מה זה שמירה לא רגילה?
ואין ב PDF את האוגרים האלו מה שאמרת עם ה INC
אז אני מניחה שאם יש לי כמה ריבועים אז בהתאם לכמות הריבועים אני לוקחת את האוגרים בסדר שאתה כתבת, נכון?ויופי RET זה 0xC3 אני חושבת שחיפשתי כבר כמה ימים איך אני מוצאת מה הערך שלו כי מצאתי שגיאה בספר באינטרנט שכתבו שם שגם LEAVE וגם RET הם 0xC9
אולי צריך לקחת את ה PDF שלך ולהככניס בו גם את ה OPCODEים ואז הוא יהיה הכי טוב מכולם.מצטערת אם יצא לי לחפור יותר מידי אבל נראה לי שזה חשוב כי זאת תוכנית ראשונה וזה הבסיס לכל תוכנית אחרת
י
30 במרץ 2013 בשעה 23:00 #77973nopsledמשתתףוהנה תראה פה ש 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
זה לא אותה פקודה כי זה אופקודים שונים30 במרץ 2013 בשעה 23:04 #77972nopsledמשתתףסליחה התכוונתי ש RETN הוא גם C3
ולא C231 במרץ 2013 בשעה 01:21 #77971nopsledמשתתףויש לי את ה
push ebp
mov ebp, esp
ב MAIN כי ה MAIN הוא פונקציה לכל דבר אז גם הוא צריך יצירה של STACK
ואת הפקודוהת האלו גם
נכון?31 במרץ 2013 בשעה 06:47 #77970CodeGuruמנהל בפורוםב"רגילים" התכוונתי לשמירה במחסנית של ערך של אוגר כדי שאפשר יהיה להשתמש בו למשהו אחר ואז הוצאה ממנה חזרה של הערך המקורי. למשל דוגמא 7.7 בעמוד 276 בספר של האוניברסיטה הפתוחה
cse.proj.ac.il/asembli/st-book-pdf.pdf
חייבים לשמור במקרה שצריך את הערך המקורי אחר כך, אבל קומפילרים שומרים הכל בכל מקרה כי לפעמים קשה לדעת האם הערך ישתנה ואו האם נזדקק לערך הישן בעתיד. לעיתים אופטימיזציה טובה יכולה להשמיט פקודות אלו.
בדרך כלל יש רק מחסנית אחת (צריך לעשות פעולות מיוחדות כדי לייצר יותר מאחת). הפקודות
push ebp
mov ebp, esp
נועדו לשמור על מצב המחסנית ולשחזר אותה בסוף השגרה על ידי זוג הפקודות
mov esp, ebp
pop ebpRET
הוא לחזור משגרה. האסמבלי מתרגם אותו ל
Return Near או Return Far
בהתאם לסוג השגרה
Call או Call Far31 במרץ 2013 בשעה 14:25 #77969nopsledמשתתףאתה מסביר ממש ברור
מה שהכי טוב הוא שאתה מביא מקומות ממש מדויקים לתשובות
נראה לי שעכשיו אני אצטרך לקרוא את מה שהבאת לי כי זה כמה מאות עמודים ואולי הרבה דברים יהיו ברורים אחרי זה -
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.