ABA


"שאלה באסמבלר למתחילים.."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15876 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15876
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   23:43   05.05.10   
אל הפורום  
  שאלה באסמבלר למתחילים..  
 
   די התחלתי קורס לא מזמן..
רציתי לדעת אם אפשר לקבל הסבר קצר של איך עובדת המחסנית של התוכנית.
כאשר אני מבצע קריאה לפונקציה אני אמור לעשות Push למחסנית לפרמטרים מסויימים ובסוף לשחרר אותם..
יש איזה סטנדרט שצריך להוסיך 8 בתים לכתובת התחלה או משהו..
הכל אצלי בסלט..ואני אשמח לקבל הסבר של איזה אוגרים בדיוק מנהלים את בסיס המחסנית..איפה אני דוחף מה..ואיפה ביחס לבסיס נמצא הפרמטר הראשון שדחפתי?


תודה רבה.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב ronen333  06.05.10 03:16 1
     האם שאני די מתחיל VeNom  06.05.10 10:20 2
         מכתב ronen333  06.05.10 10:36 3
             כן אני מבין VeNom  06.05.10 10:50 5
                 2 ronen333  06.05.10 10:54 6
                     כן את זה אני יודע.. VeNom  06.05.10 11:14 7
                         כל ''איבר'' במחסנית זה WORD ronen333  06.05.10 11:19 8
                             לא קריטי.. VeNom  06.05.10 11:31 9
                                 מכתב ronen333  06.05.10 11:35 10
                                     תודה.. VeNom  06.05.10 11:37 11
     רשמתי את זה בשעה מאוחרת ronen333  06.05.10 10:39 4

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   03:16   06.05.10   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 06.05.10 בשעה 03:19 בברכה, ronen333
 
אתה דוחף 2 בתים (ווארד) למחסנית עבור כל פרמטר שאתה מעביר. שאתה עושה CALL שם פונקציה זה מכניס את כתובת הIP למחסנית.
בדר"כ שאתה עובד עם אוגרים ורוצה לשמור את המצב הקודם של האוגרים אתה עושה גם PUSHים אליהם בתחילת הפונקציה וPOPים בסוף על מנת להחזיר את המצב הקודם. הפקודה RET "שולפת" מהמחסנית 2 בתים(ווארד) כפול מספר הפרמטרים שלך. (שמתי שולפת במרכאות כי אתה לא באמת שולף אלא מזיז את האוגר SP).

אני אתן לך דוגמה אני מניח שזה יעזור לך:


int func(int a)
{
if(a<=1)
return 1;
else
return func(a-1)*a;
}

קריאה לפונקציה:

int res=func(5);


עכשיו בתרגום לאסמבלי:

func proc
push bp
mov bp,sp
push si

mov si,
cmp si,1
jg else
mov ax,1
jmp end_func

else:
dec si
push si
call func
mov si,
imul si

end_func:
pop si
pop bp
ret 2
fanc endp

קריאה לפונקציה:
mov ax,5
push ax
call func
mov res,ax


למה BP+4? כי שאתה מבצע קריאה (CALL) אתה מכניס למחסנית את הכתובת IP, ולכן SP קטן ב2 בתים ואתה דוחף את התוכן של האוגר BP- אזי גם קטן ב2 בתים- סכ"ה 4 בתים.

נוח מאוד לעבוד עם BP או SI כדי לעבוד עם פרמטרים..

מקווה שזה מספיק ברור


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   10:20   06.05.10   
אל הפורום  
  2. האם שאני די מתחיל  
בתגובה להודעה מספר 1
 
   אבל פחות או יותר הבנתי..
כאילו בקריאה לפונקציה יש push אוטומטי לכתובת חזרה שזה 4 בתים..ולכן אתה מוסיף 8 בתים על מנת להגיע לפרמטר הראשון שדחפת כביכול..
רק עוד 2 שאלות קצרות..
יש את פקודת ה ret בסוף פונקציה..ומספר ליד..אני הבנתי שזה סוג של שחרור זכרון ע"י הזזת הפוינטר במספר הבתים שרשום שם..אתה יכול להגיד איזה סוג זכרון?

נניח שיש לי תוכנית שמקבלת סטרינג והופכת אותו בצורה הבאה:


str dword 5 ; size of string
byte "malam" ; the string
revStr byte ? ; space for output string

בעקרון אני עושה דחיפה כאן למקום הריק ולסטרינג המקורי..סה"כ 2 דחיפות וקורא לפונקציה.
הכל עובד מעולה..רק במקרה שלי כמה ret אתה צריך לשחרר?8 כי דחפתי 2פריטים של 4 בייט כל אחד(מקום בזכרון הוא 4 בייט)..?או 2 כגודל האובייקטים? או שאני לא בכיוון..?
תודה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:36   06.05.10   
אל הפורום  
  3. מכתב  
בתגובה להודעה מספר 2
 
   הסברתי את זה בהודעה שלי, אבל באמת רשמתי את זה קצת קופצני כזה אז אני אסביר שוב.
אין דבר כזה שליפה, אתה יכול לטייל בזכרון ולרמות באסמבלי פי כמה וכמה מC.
שאתה מבצע RET מה שזה עושה זה מזיז את הSTACK POINTER
2 כפול מספר הפרמטרים שלך (כי בדר"כ כל פרמטר אצלך שווה WORD, למרות שאתה תמיד יכול להתיחס ל2 פרמטרים בWORD אחד, וההפך- להתייחס לפרמטר אחד כDWORD. הכל שאלה של התייחסות)
ואז מה שקורה זה שהוא מכניס את התוכן של SP לאוגר IP, וככה הוא יודע מאיפה להמשיך..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   10:50   06.05.10   
אל הפורום  
  5. כן אני מבין  
בתגובה להודעה מספר 3
 
   אבל אם אני מבצע דחיפה(של פוינטר = 32 ביט) למחסנית פעמיים..
ניגש לפונקציה ומסיים את העבודה..
אני אמור לכתוב
ret 8?
או
ret 2?
או משהו אחר?
אני "משחרר" גודל ב bytes?או מספר כתובות שדחפתי למחסנית או משהו אחר בכלל?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:54   06.05.10   
אל הפורום  
  6. 2  
בתגובה להודעה מספר 5
 
   אני לא רואה למה אני צריך לרושם לך את זה אני בטוח שאתה יודע.
32 ביט=4 בית=2 WORD.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   11:14   06.05.10   
אל הפורום  
  7. כן את זה אני יודע..  
בתגובה להודעה מספר 6
 
   טוב אני כנראה הבנתי שזה שחרור בבתים רגילים..ולא ב word's..
אבל תודה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:19   06.05.10   
אל הפורום  
  8. כל ''איבר'' במחסנית זה WORD  
בתגובה להודעה מספר 7
 
   זה למה אתה צריך לחשב כמה זה בWORD.
מצטער שאני לא כזה ברור..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   11:31   06.05.10   
אל הפורום  
  9. לא קריטי..  
בתגובה להודעה מספר 8
 
   אני הרי דוחף dwords של 32 ביט(כתובות)..מוזר לי שאני צריך לחשב כמה זה ב word ולשחרר..
אם אני דוחף 2 dwords = 64 ביט = 4 words אז לפי מה שאתה אומר אני אמור לשחרר סה"כ
ret 4
יש דרך לבדוק האם אני מגיע למקום המתאים?בסופו של דבר?כי גם אם אני רושם ret 12 אז אני לא רואה שום דבר מוזר בבלוק זכרון שחשוב לי לפלט התוכנית וזה לא קורס בזמן ריצה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:35   06.05.10   
אל הפורום  
  10. מכתב  
בתגובה להודעה מספר 9
 
   תעשה תוכניות בדיקה (זה לפחות מה שאני עשיתי בזמנו), ותחקור איך דברים מתנהלים מלבד איך שדברים כתובים באיזה ספר.
תכתוב פונקציה ותראה אם זה מחזיר כמו שצריך..
ממליץ לך להוריד את התוכנה EMU, אתה יכול גם לעקוב אחרי הSTACK,דגלים,אוגרים והכל.
יש גם הרבה דברים, שנגיד מרצים שוכחים לציין ואז שאתה הולך ובודק אתה מגלה את הדקויות הקטנות האלה..

שיהיה בהצלחה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   11:37   06.05.10   
אל הפורום  
  11. תודה..  
בתגובה להודעה מספר 10
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:39   06.05.10   
אל הפורום  
  4. רשמתי את זה בשעה מאוחרת  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 06.05.10 בשעה 10:44 בברכה, ronen333
 
אני מניח שהבנת כבר... אבל בסוף צריך לרשום func endp ולא fanc עם a.
ושכחתי לעשות המרת סוגריים.. אז הנה תיקון לקוד:

int func(int a)
{
if(a<=1)
return 1;
else
return func(a-1)*a;
}

קריאה לפונקציה:

int res=func(5);


עכשיו בתרגום לאסמבלי:

func proc
push bp
mov bp,sp
push si

mov si,[bp+4]
cmp si,1
jg else
mov ax,1
jmp end_func

else:
dec si
push si
call func
mov si,[bp+4]
imul si

end_func:
pop si
pop bp
ret 2
func endp

קריאה לפונקציה:
mov ax,5
push ax
call func
mov res,ax


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net