עזרה בלהבין קוד אסמבלי שקומפיילרים יוצרים

עמוד

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

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

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

    gcc:
    mov edx, [ebp+var_4]
    mov eax, edx
    add eax, eax
    add eax, edx
    shl eax, 2
    add eax, edx
    mov [ebp+var_8], eax

    Visual CPP:
    mov ecx, [ebp+var_4]
    sub ecx, 1Eh
    neg ecx
    sbb ecx, ecx
    mov [ebp+var_C], ecx

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

    שני החלקים מחשבים משהו כפונקציה של
    [ebp+var_4]
    החלק הראשון נראה כמו הכפלה ב-13 (שמתאים למבנה נתונים בגודל כזה) והתוצאה ב
    [ebp+var_8]
     והשני מחשב ביט בודד (אפס או מינוס אחת).
    והתוצאה ב
    [ebp+var_c]

    כדאי לראות את קטע הקוד בשפה העילית במקביל.

    #77967
    nopsled
    משתתף

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

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

    אם נגדיר, למשל, מערך שכל איבר בו מכיל שני מספרים שלמים, מספר ממשי, וביט בוליאני אז הגודל של כל איבר יהיה
    2*sizeof(int)+sizeof(float)+sizeof(boolean) = 2*4+4+1 = 13
    ואז, אם שמים אותם ברציפות בזכרון, הכתובת של האיבר ה
    N
    היא
    Base + 13*N

    ולמה זה מכפיל ב-13? הנה הסבר:
    mov eax, edx   ax = dx
    add eax, eax    ax = ax+ax = 2*dx
    add eax, edx    ax = ax+dx = 3*dx
    shl eax, 2         ax = ax<<2 = 12*dx
    add eax, edx    ax = ax+dx = 13*dx

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