שאלות דו-משמעיות

עמוד
מוצגות 15 תגובות – 1 עד 15 (מתוך 16 סה״כ)
  • מאת
    תגובות
  • #77442
    Yoni
    משתתף

    בחלק מהשאלות בשלב ב´ (אני מתייחס לאחת בלבד, אבל בכל זאת אדבר בלשון רבים) יש לדעתי יותר מאפשרות אחת נכונה.

    למשל בשאלה 2: איזו פקודה ב-80×86 יוצאת דופן?
    1. push
    2. pop
    3. jmp
    4. ret

    בתחרות עצמה בחרתי ב-jmp, שכן כל שאר האפשרויות משנות את המחסנית (push מקטינה את eSP ו-pop ו-ret מגדילות את eSP, ו-jmp לא משנה את eSP…).
    עכשיו כשאני מסתכל על זה שוב אני רואה אפשרות אחרת: ret, מפני שבכל שאר האפשרויות ניתן לתת אוגר בתור אופרנד. למשל הפקודות האלה חוקיות:
    push eAX
    pop eAX
    jmp eAX – יחסית נדיר אבל חוקי
    אבל: ret eAX לא חוקי.

    אז למה התכוון המשורר?

    * הערה: כשאני כותב eAX אני מתכוון "AX או EAX".

    #79410
    טל צרפתי
    משתתף

    כותרת: אני אמרתי ret

    #79411
    אורח
    משתתף

    כותרת: אני אמרתי דווקא jmp
    זה יותר חזק, אני חושב..

    #79412
    דניאלק
    משתתף

    כותרת: אני חושב באמת שjmp יותר "חזק"
    RET/POP/PUSH הן פעולות על הStack.
    JMP לא נוגעת בStack.

    JMP ו RET אמנם קופצות למקום אחר בקוד, אבל PUSH/POP לא.

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

    זה די דומה לאחת השאלות מתחרות קודמת:
    MOV AX, 0
    SUB AX, AX
    ADD AX, AX
    XOR AX, AX
    מה יוצא דופן?
    ברור ש3 מהם מקבלים AX,AX ורק אחד מקבל 0, אבל פונקציונלית – הקטע של האיפוס הוא המכריע.

    אגב, עוד שאלה דו-משמעית:
    מה יוצא דופן:
    Pipes
    Mailslots
    Copydata
    Sockets

    גם כאן אפשר לחשוב על כל מיני דברים:
    כולם כמובן דרכים ל Interprocess communication,

    CopyData הוא היחידי שתלוי בUser32, היחידי שיש בWindows אבל אין בUnix, היחידי שאי אפשר לתקשר באמצעותו עם תוכניות שנמצאות על מחשבים אחרים ברשת(בהנחחה שמשתמשים בNamed pipes כמובן)

    מצד שני, יש את הנושא של החד כיווניות:
    Sockets הם דו כיוונים
    pipes הם דו כיווניים רק אם הם named pipes(fifo)
    Copydata הוא דו כיווני רק אם יש לשתי התוכניות חלונות וMessage loop
    וMailslots הם חד כיווניים – נקודה.

    ויש את כמובן את נושא הStreaming:
    Mailslots ו copy data בנויות בצורה ברורה של שליחת הודעה(מעין datagram אם תרצו)
    pipes נותנים stream,
    וSockets – תלוי בפרוטוקול מעליו הוא יושב(UDP/TCP, או למי שרוצה להתחכם – אפשר גם Packet Sockets בUnix, שמטפלים בEthernet Packets).

    לדעתי לפחות ההבדל הגדול ביותר הוא בשימוש: CopyData הוא היחידי שנועד אך ורק לLocal IPC, בניגוד ל3 האחרים, שמאפשרים גם Network IPC.

    #79413
    Yoni
    משתתף

    כותרת: לא חשבתי על זה –
    בחרתי ב-jmp וב-CopyData ואני עכשיו עדיין חושב שאלו 2 האפשרויות הנכונות.

    השיקול שלי לבחור ב-CopyData היה רק העובדה שזה לא עובד ברשת והאחרים כן. לא חשבתי על חד-/דו-כיווניות, למרות שזה הבדל קצת לא ברור (אפשר להתווכח ש-CopyData הוא חד-כיווני, ויש גם סוגים של Socket שהם חד-כיווניים… וכו´) או על Unix מול Win32, או על Streaming… נקודות טובות, אבל IPC ברשת מול IPC מקומי זה ההבדל הכי חזק לדעתי.

    #79415
    MoD
    משתתף

    כותרת: מקווה לטוב :) —> בטח איפה שהוא במקום אחרון…
    :)
    אני בחרתי ב
    ret
    CopyData
    לגבי ret… וול אני גרוע באסמבלי – זה היה ניחוש :)
    לגבי CopyData – לפי טיעונו של דניאל.

    ***Note to myself – ***
    Learn ASM! ;)
    ***********************

    #79435

    כותרת: אני התלבטתי ובסוף בחרתי ב RET לפי הטיעון השני
    שאי אפשר יהיה לייחס לפקודה הזו אופרנד ולכל השאר אפשר…

    #79438
    דניאלק
    משתתף

    כותרת: זה לא מדויק…
    RET בהחלט יכול לקבל אופרנד – Displacment בן 2 בתים, שאומר לRET מלבד להוריד את הIP(או CS:IP עבור Far return) מהמחסנית, להוריד גם את הפרמטרים שניתנו לפונקציה.

    מתי משתמשים בזה? תלוי בCalling convention. בC, זה אחריות מי שקורא לפונקציה לנקות את הStack, אבל בstdcall למשל, זה באחריות הפונקציה.

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

    #79443

    כותרת: pop יוצא דופן… ?
    לפחות לפי הרצה מהירה של debug, גם push לא יכול לקבל פרמטר מפסרי ישירות. ייתכן ואני טועה ואפשר אם כותבים לו את גודל האופרנד?

    #79451
    Yoni
    משתתף

    כותרת: אל תאמין ל-debug.exe
    6A17 = push 17

    C:>debug
    -a
    0B23:0100 push 17
    ^ Error
    0B23:0100

    debug.exe מכיר רק תת-קבוצה קטנה יחסית מתוך ה-instruction set המלא. (מספיק טוב בשביל לבדוק במהירות את רוב שאלות האסמבלי מתוך שאלונים של CodeGuru, אבל לא בשביל לבדוק האם push יכול לקבל אופרנד מספרי…)

    #79452
    arkon
    משתתף

    כותרת: זה לא עניין של "אמונה" אלא
    זה תלוי הקוד, כלומר ב 16 סיביות אי אפשר לתת אימדייט ל PUSH
    וב 32 כן אפשר..

    אגב לכל הויכוחים אם זה RET או JMP
    אז אם מי שכתב את השאלה היה חושב שזה הקטע של האופרנדים הוא היה שם שאלה עם תשובות אחרות, לדעתי.

    ובקשר לIPC, כנראה שבגלל זה השאלה סומנה בכוכבית.

    #79453
    Yoni
    משתתף

    כותרת: לפחות לפי HIEW –
    6A17 = קוד מכונה ל-"push 17" גם ב-16 וגם ב-32 ביט.

    #79454
    דניאלק
    משתתף

    כותרת: קצת מידע היסטורי…
    אכן, Debug לא מאפשר Push immediate.
    הסיבה לכך די פשוטה – debug מותאם למעבדי 8086.
    Push immediate קיים רק מאז ה80186, אבל בכל מקרה, אף אחד כאן לא הגביל את השאלה ל8086.

    מה שכן, אני מסכים עם ארקון, ההבדל של המחסנית הוא די ברור, לחפש את ההבדל באופרנדים, זה קצת לחפש בנרות… לשאלה כזאת יותר מתאים משהו כמו – מי יוצא דופן – AND OR XOR NOT.

    #79455
    דניאלק
    משתתף

    כותרת: קצת מידע היסטורי…
    אכן, Debug לא מאפשר Push immediate.
    הסיבה לכך די פשוטה – debug מותאם למעבדי 8086.
    Push immediate קיים רק מאז ה80186, אבל בכל מקרה, אף אחד כאן לא הגביל את השאלה ל8086.

    מה שכן, אני מסכים עם ארקון, ההבדל של המחסנית הוא די ברור, לחפש את ההבדל באופרנדים, זה קצת לחפש בנרות… לשאלה כזאת יותר מתאים משהו כמו – מי יוצא דופן – AND OR XOR NOT.

    #79456
    arkon
    משתתף

    כותרת: וואללה…

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