התגובות שלי בפורום
-
מאתתגובות
-
kirill578משתתף
באת אתחול המשחק, הזירה מתמלאת כולה ב-
0xcc
שמתפשר כמו
int 3
מנוע המשחק מחשיב את הפקודה כלא חוקית, ולכן אם תריצה, תיפסל.kirill578משתתףכן, אבל זה לא יקרה בכל הרצה.
אתה יכול לקחת שורדים משנים קודמות ולמחוק להם את החלק בקוד שהורג את השורדים שהם השתלטו עליהם.
תסתכל בקוד של מאמליה (יש פה בפורום את הקוד מקור)kirill578משתתףאיפה רואים בקוד שהזומבים רצים אחרי השורדים?
הייתי שמח לקבל את השורה המדויקת כמו שרשמת למעלה
הזומבים נטענים אחרי השורדים למערך, סדר הרצת השורדים הוא כסדר המערך
https://github.com/kirill578/corewars8086/blob/master/corewars8086/src/il/co/codeguru/corewars8086/war/WarriorRepository.java#L109ואיזה תו הוא תמיד יהיה הכי ראשון?
השווה בין מחרוזות בג'ווה מתבצעת ע"י השווה בין ארכי היוניקוד, הערך הכי נמוך של תו ביוניקוד שניתן להדפיס הוא 21 אקסה
שזה סימן קריאה!אני מניח שטילדה כי זה מה ששמו בשם של מי שרצה לנצל את הבג הזה נכון?
כן, אבל בהרצה הסופית לא הייתה לה משמעות כי הרצנו ללא הקוד של הזומבים
התילדה הכפולה הייתה לבדוק אם השורד ששלחנו התקבל (בדיקה ויזואלית שהשם באמת מתחיל בשני תילדות)או כמה טילדות כדי להיות לפני מישהו ששם טילדה
או הרבה טילדות כדי להיות לפני מישהו ששם כמה טילדות
—
עדיף לתקן את הבאג ולסגור את הסיפורkirill578משתתףלאחר שאתם משתלטים על הזומבים האם אתם משנים את הקוד שלהם כדי שיעשו משהו אחר?
לאחר שאנחנו מגלים את מיקום הזומבים אנחנו מקפיצים אותם לקוד שלנואיזה חלק מכל הקוד של הזומבים אתם משתלטים עליו?
מחליפים את הפקודה האחרונה של הקפיצה לקפיצה אבסולוטית, למקום בוא כל הזומבים שלנו רציםראיתי שבאתר כתבו "הסדר בו ישחקו השורדים בכל סיבוב נקבע בתחילת המשחק באופן אקראי, ואינו משתנה במהלכו."
איך זה מסתדר עם מה שאתה כתבת ש:
"אנחנו רצים ראשונים בכל סיבוב, והזומבים אחרונים. כך שאף אחד לא רץ בינינו "
הדבר היחידי שאני רואה בקוד שהוא אקראי הוא מיקום השורדים בזירה, אשמח אם יתקנו אותי. בכל מקרה באמת זה סוג בעיה שצריך לתקן, אבל אפשר להסתדר איתו.
(אתה מוזמן לנסות לתקן את הבאג בעצמך, ולעשות פולל-ריקויסט בגיט-חאב) (אני משתדל לכתוב בעיברית כדי שלא היה בלגן עם הסדר של המילים)ולגבי הזומבים של השנה – היו שישה כאלו
האם כל הזומבים עושים אותו הדבר או שיש להם תפקיד שונה
—-
הם עושים כמעט אותו הדבר, כל אחד מהם רושם את השארית בחילוק של הכתובת שלו עם המספר המופיע בכתובת
0cXdeh
כאשר איקס הוא המספר של הזומבי
ואת התוצאה של החילוק ניתן למצוא לאחר מספר דפקי שעון בכתובת
0cXddh
כאשר איקס הוא שוב המספר של הזומבי.kirill578משתתףאם הזומבים תמיד יהיו אחרונים?
כןאיך אתם רצים מייד אחרי הזומבים?
אנחנו רצים ראשונים בכל סיבוב, והזומבים אחרונים. כך שאף אחד לא רץ בינינואיך אתם רצים תמיד ראשונים בכל סיבוב וגם רצים מייד אחרי הזומבים?
אחרי השורד האחרון רץ הראשוןאיפה בקוד של המנוע יש את קטע הקוד שמאפשר לכם לעשות את זה?
הנה קטע הקוד שמסדר את השורדים לפני סדר האלף ב', כמובן שטילדה היא לפנות האות a
https://github.com/kirill578/corewars8086/blob/master/corewars8086/src/il/co/codeguru/corewars8086/war/WarriorRepository.java#L79מה סדר הריצה של השורדים והזומבים בתחרות?
לפי סדר האלפבת, ואז הזומביםאיזה קוד שלכם הזומבים מתקנים? איך הם עושים את זה?
בשלב האתחול של הזומבים הם מגבים אצלם באזור הפרטי את תוכל הלולאה ואת קוד הבירחה שלנו. לאחר שלב ההתחול הזומבים מעתיקים את הקוד המגובה למקום בו אנחנו רצים. כל הזומבים מתקנים את אותו קוד, אך במרווח של כמה כתובות בודדות.האם כל הזומבים מתקנים אותו הדבר או כל אחד מתקן משהו אחר?
כל הזומבים חוץ מהזומבי השני מתקנים, הזמבי השני מגן על הזומבים, כאשר הזומבי השני יזה התקרבות לקוד של הזומבים הוא יעתיק את הקוד למקום אחר ויקפיץ את כל הזומבים למקום החדשאיך עושים דבר כזה? למה זה קורה?
כאשר מישהו כותב לנו על הקוד, הזומבים שרצים לפנינו יתקנו את הפגם בקוד לפני שאנחנו נריץ אותולא הבנתי בכלל את המשפט הזה – אפשר להסביר למה התכוונתם כאן?
כאשר המנוע מכין את הזירה הוא מקציב אזורי זיכרון עבור כל השורדים, כאשר כל קטע זיכרון בא לאחר הקטע הקודם. אם תסתכל על הקוד של הזומבים, תראה שהוא לא משמר את הקוד של הסיגמנט המשותף שלהם.
אבל במידה ומריצים 4 קבוצות שורדים שבכל אחת יש 2 שורדים. אז אזור הפרטי של הזומבים יהיה 2500
במידה ותנסה להריץ את את השורד ללא עוד 3 קבוצות כל הזומבים ימותו כי הם ינסו לכתובת 2500 שהי הינה הזיכרון הפרטי במיקרה אחרגם על איזה קוד מדובר? של איזה שורד או זומבי?
השאלה לא ברורהאיך עושים את החישוב של 2500?
פשוט תריץ את המנוע עם עוד 4 קבוצות ותראה מה הערך של האזור הפרטי של הזומבים (בעזרת הדיבגר)kirill578משתתףאחרי שהשטלטנו על הזומבים, הם מגבים את החלק הלולאה של הבדיקה שבא אנחנו רצים רוב הזמן, ואז כותבים אותה כל הזמן בחזרה, הדבר מונע מוות כאשר כותבים עלינו בצורה אנחית.
כאשר הזומבי השני שנפס מגן על שאר הזומבים באותה צורה שאנחנו מגנים על עצמינולגבי הטילדה בשם, זה מאפשר לנו לרוץ ראשונים בכל סיבוב. הסיבה לכך היא לא בגלל שאנחנו מרווחים אופקוד נוסף אלה שאנחנו רצים מייד אחרי הזומבים. (הזומבים תמיד יהיו אחרונים).
כאשר אנחנו רצים אחרי הזומבים וכותבים לנו כל הקוד, הזומבים יתקנו לנו את הקוד רגע לפני שאנחנו מריצים אותו.
שים לב שבמידה ואתה רוצה להריץ את הקוד חיבים להריץ עם עוד 3 קבוצות של שורדים, כך שהסגמנט שהמשותף של הזומבים יהיה 2500
kirill578משתתףכדי לערוך חייבים להירשם, ואני לא מוצא אפשרות להירשם
kirill578משתתףTry to run it with DOSBOX
kirill578משתתףהחלק הזה מאוד מבלבל, תוכל להסביר מה הוא עושה?
lea di,[si+@end-@loop-0c00h+4h]
lea sp,[si-800h+4h]
mov si,0a5f3h ; 0a5f3h = opcode of rep movsw
push sp ; protection from int 87h
push si
push sp
pop sp
mov bx,-0c00h
mov dx,-800h+2h
mov bp,-400h+4h
mov ax,0815eh ; ax is a clock
mov si,4h
mov cx,200h-2h
-
מאתתגובות