ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › ראשי › שאלות דו-משמעיות
- This topic has 15 תגובות, 8 משתתפים, and was last updated לפני 21 שנים, 7 חודשים by arkon.
-
מאתתגובות
-
23 באפריל 2003 בשעה 18:31 #77442Yoniמשתתף
בחלק מהשאלות בשלב ב´ (אני מתייחס לאחת בלבד, אבל בכל זאת אדבר בלשון רבים) יש לדעתי יותר מאפשרות אחת נכונה.
למשל בשאלה 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".
23 באפריל 2003 בשעה 18:32 #79410טל צרפתימשתתףכותרת: אני אמרתי ret
23 באפריל 2003 בשעה 18:33 #79411אורחמשתתףכותרת: אני אמרתי דווקא jmp
זה יותר חזק, אני חושב..23 באפריל 2003 בשעה 19:46 #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.
23 באפריל 2003 בשעה 19:59 #79413Yoniמשתתףכותרת: לא חשבתי על זה –
בחרתי ב-jmp וב-CopyData ואני עכשיו עדיין חושב שאלו 2 האפשרויות הנכונות.השיקול שלי לבחור ב-CopyData היה רק העובדה שזה לא עובד ברשת והאחרים כן. לא חשבתי על חד-/דו-כיווניות, למרות שזה הבדל קצת לא ברור (אפשר להתווכח ש-CopyData הוא חד-כיווני, ויש גם סוגים של Socket שהם חד-כיווניים… וכו´) או על Unix מול Win32, או על Streaming… נקודות טובות, אבל IPC ברשת מול IPC מקומי זה ההבדל הכי חזק לדעתי.
23 באפריל 2003 בשעה 21:39 #79415MoDמשתתףכותרת: מקווה לטוב —> בטח איפה שהוא במקום אחרון…
אני בחרתי ב
ret
CopyData
לגבי ret… וול אני גרוע באסמבלי – זה היה ניחוש
לגבי CopyData – לפי טיעונו של דניאל.***Note to myself – ***
Learn ASM!
***********************24 באפריל 2003 בשעה 13:19 #79435נתי צחנסקימשתתףכותרת: אני התלבטתי ובסוף בחרתי ב RET לפי הטיעון השני
שאי אפשר יהיה לייחס לפקודה הזו אופרנד ולכל השאר אפשר…24 באפריל 2003 בשעה 14:18 #79438דניאלקמשתתףכותרת: זה לא מדויק…
RET בהחלט יכול לקבל אופרנד – Displacment בן 2 בתים, שאומר לRET מלבד להוריד את הIP(או CS:IP עבור Far return) מהמחסנית, להוריד גם את הפרמטרים שניתנו לפונקציה.מתי משתמשים בזה? תלוי בCalling convention. בC, זה אחריות מי שקורא לפונקציה לנקות את הStack, אבל בstdcall למשל, זה באחריות הפונקציה.
אז אם כבר, POP הוא היוצא דופן, שכן הוא היחיד שלא מסוגל לקבל ערך מספרי כאופרנד.
24 באפריל 2003 בשעה 18:35 #79443יהושע ספירמשתתףכותרת: pop יוצא דופן… ?
לפחות לפי הרצה מהירה של debug, גם push לא יכול לקבל פרמטר מפסרי ישירות. ייתכן ואני טועה ואפשר אם כותבים לו את גודל האופרנד?24 באפריל 2003 בשעה 22:26 #79451Yoniמשתתףכותרת: אל תאמין ל-debug.exe
6A17 = push 17C:>debug
-a
0B23:0100 push 17
^ Error
0B23:0100debug.exe מכיר רק תת-קבוצה קטנה יחסית מתוך ה-instruction set המלא. (מספיק טוב בשביל לבדוק במהירות את רוב שאלות האסמבלי מתוך שאלונים של CodeGuru, אבל לא בשביל לבדוק האם push יכול לקבל אופרנד מספרי…)
24 באפריל 2003 בשעה 22:39 #79452arkonמשתתףכותרת: זה לא עניין של "אמונה" אלא
זה תלוי הקוד, כלומר ב 16 סיביות אי אפשר לתת אימדייט ל PUSH
וב 32 כן אפשר..אגב לכל הויכוחים אם זה RET או JMP
אז אם מי שכתב את השאלה היה חושב שזה הקטע של האופרנדים הוא היה שם שאלה עם תשובות אחרות, לדעתי.ובקשר לIPC, כנראה שבגלל זה השאלה סומנה בכוכבית.
24 באפריל 2003 בשעה 23:07 #79453Yoniמשתתףכותרת: לפחות לפי HIEW –
6A17 = קוד מכונה ל-"push 17" גם ב-16 וגם ב-32 ביט.24 באפריל 2003 בשעה 23:24 #79454דניאלקמשתתףכותרת: קצת מידע היסטורי…
אכן, Debug לא מאפשר Push immediate.
הסיבה לכך די פשוטה – debug מותאם למעבדי 8086.
Push immediate קיים רק מאז ה80186, אבל בכל מקרה, אף אחד כאן לא הגביל את השאלה ל8086.מה שכן, אני מסכים עם ארקון, ההבדל של המחסנית הוא די ברור, לחפש את ההבדל באופרנדים, זה קצת לחפש בנרות… לשאלה כזאת יותר מתאים משהו כמו – מי יוצא דופן – AND OR XOR NOT.
24 באפריל 2003 בשעה 23:25 #79455דניאלקמשתתףכותרת: קצת מידע היסטורי…
אכן, Debug לא מאפשר Push immediate.
הסיבה לכך די פשוטה – debug מותאם למעבדי 8086.
Push immediate קיים רק מאז ה80186, אבל בכל מקרה, אף אחד כאן לא הגביל את השאלה ל8086.מה שכן, אני מסכים עם ארקון, ההבדל של המחסנית הוא די ברור, לחפש את ההבדל באופרנדים, זה קצת לחפש בנרות… לשאלה כזאת יותר מתאים משהו כמו – מי יוצא דופן – AND OR XOR NOT.
25 באפריל 2003 בשעה 00:12 #79456arkonמשתתףכותרת: וואללה…
-
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.