הטיפ היומי 2 – טקטיקות הגנה והתקפה + כמה שורדים

עמוד

ברוכים הבאים לאתר תחרויות קודגורו! פורומים אקסטרים הטיפ היומי 2 – טקטיקות הגנה והתקפה + כמה שורדים

מוצגות 1 תגובות (מתוך 1 סה״כ)
  • מאת
    תגובות
  • #77676
    Eat Bit not Meat
    משתתף

    הטיפ היומי 2 – טקטיקות הגנה והתקפה + כמה שורדים פשוטים ולא כל כך רעים

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

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

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

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

    BOMBER
    הלולאה המרכזית כוללת 3 פקודות, כשבכל מחזור נכתב בית אחד. לכן קצב ההתקפה הוא 1/3.
    לאחר האיתחול, רק פגיעה בלולאה המרכזית יכולה להזיק לשורד. הלולאה המרכזית כוללת 5 בתים (קל לראות זאת ע"י dis assembler, הפקודה u ב debugger של חלונות). לכן פרופיל הפגיעות הוא 5.

    CANNON
    גם כאן נכתב בית אחד כל 3 פקודות, כלומר קצב התקפה ממוצע של 1/3. כאן הלולאה המרכזית מונה 7 בתים ולכן פרופיל הפגיעות הוא 7. נתונים אלה מצביעים על שורד טוב פחות מהבומבר, אבל יש כאן 2 יתרונות שלא באים לידי ביטוי במספרים. בניגוד לבומבר, הקאנון לא תוקף את עצמו. הקאנון תוקף בתפזורת, בקפיצות של 8 ולכן הוא מנצל טוב יותר פגיעות גדולה של שורדים אחרים. זאת בניגוד לבומבר שתוקף ברצף ולכן לא מנצל למעשה פגיעות של שורדים אחרים ולכן יעילותו שקולה למצב של פגיעות 1 במתחרים.

    SHOOTER
    גם כאן הלולאה המרכזית מונה 3 פקודות, אבל השוטר כותב בכל מחזור 2 בתים ולכן קצב ההתקפה שלו הוא 2/3. פרופיל הפגיעות שלו הוא כגודל הלולאה המרכזית, 6 בתים.

    BIMP
    לולאה מרכזית בת 11 פקודות שכוללת כתיבה ל 6 מילים או 12 בתים, כלומר קצב התקפה של 12/11. גודל הלולאה הוא 12 בתים וזה פרופיל הפגיעות. כמו הבומבר, גם הבימפ תוקף ברצף ולכן אינו מנצל פרופיל פגיעות של היריב.

    עכשיו ננסה ליישם את העקרונות ולבנות שורדים בעלי פרופיל הגנה נמוך ובעלי קצב תקיפה גבוה.

    השורד הפשוט ביותר שניתן לבנות, הוא שורד ה LOOP:

    LOOP

    @loop:
    jmp @loop

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

    טיפ: שורד זה שימושי מאד כדי לבדוק שורדים משלכם. לא ניתן להריץ שורד בודד לצורך בדיקה ולכן הוספה של שורד לופ מאפשרת בדיקה עצמאית של שורד שלכם ומעקב, האם הוא עף בעצמו (עקב באגים או התקפה עצמית) וצפיה נוחה בכתיבות בלי הפרעות מכתיבות של שורד נוסף. זה גם מאפשר לבדוק עצמאית טקטיקות התקפה של השורד שלכם, בלי שיהיה חשוף במקביל להתקפות מהיריבים.

    כדי לבדוק את השורד שלכם מול יריב בעל פרופיל פגיעות גבוה יותר, ניתן להוסיף פקודות NOP בתוך הלולאה.

    רמז: ניתן להגיע גם לשורדים בעלי פרופיל פגיעות נמוך יותר.

    כעת ננסה ליצור שורד בעל קצב התקפה גבוה. המנוע תומך רק בפקודות על 8 או 16 ביטים ולכן פקודה בודדת מסוגלת לכתוב ל 2 בתים לכל היותר. שורד פשוט דורש בכל לולאה ביצוע של לפחות 3

    פעולות:
    1. כתיבה
    2. עדכון כתובת לכתיבה הבאה
    3. קפיצה לתחילת הלולאה

    זו הסיבה שרוב שורדי הדוגמה כוללים לולאה בת 3 פקודות, אבל ניתן לשפר זאת. הפקודות STOSW, MOVSW כוללות עדכון של מצביעים וכתיבה בפקודה אחת, דבר שחוסך לנו פקודה ומאפשר לולאה של 2 פקודות בלבד:

    ATTACK1

    <איתחול>
    @loop:
    STOSW
    jmp @loop

    כאן יש כתיבה של 2 בתים כל 2 פקודות, כלומר קצב התקפה של 1. ניתן לשפר זאת, על ידי שכפול של פקודת STOSW, כמו שנעשה בבימפ:

    ATTACK2

    <איתחול>
    @loop:
    STOSW
    STOSW
    STOSW
    STOSW
    STOSW
    jmp @loop

    אם נשכפל את הפקודה N פעמים, נקבל כתיבה ל 2N בתים ב 2N+1 פקודות, כלומר קצב של 2N/2N+1. ככל שנעלה את N יעלה קצב ההתקפה, אבל במחיר של פרופיל פגיעות גבוה יותר.
    במנוע החדש שתומך בפקודה REP, ניתן לשפר זאת:

    REPEATER

    <איתחול>
    @loop:
    MOV CX,0FFFFh
    REP
    STOSW
    jmp @loop

    כאן קצב ההתקפה הוא כמעט 2, לכאורה, פרופיל הפגיעות גבוה במעט מהלולאה המקורית. באופן מעשי, לולאת ה REP לעולם לא תסתיים (למה?) ולכן פרופיל הפגיעות כאן נמוך מאד (כמה?)

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

    רמז: ניתן להגיע גם לקצב התקפה גבוה מ 2, זה לא מאד פשוט ודורש טריק מסויים.
    ================================
    Eat Bit not Meat
    מוגש בחסות "אכלו ביטים ולא חיות"
    אתר מומלץ יומי: http://www.animal.org.il

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