ערכתי לאחרונה בתאריך 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 simov 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 כדי לעבוד עם פרמטרים..
מקווה שזה מספיק ברור

