שאלה לגבי מנוע ההרצה של השורדים

עמוד

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

מוצגות 5 תגובות – 1 עד 5 (מתוך 5 סה״כ)
  • מאת
    תגובות
  • #76920
    Sarthobi
    משתתף

    כמו בכותרת או יותר נכון מה קורה אם..:

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

    אני מנסה להפעיל פקודות קפיצה פשוטה, אך אני רוצה לקפוץ לכתובת הכתובה באוגר, כמו לדוגמא:

      Jmp BX

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

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

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

    תודה מראש.

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

    אפשר להשתמש בפקודה

    jmp ax

    או בצורה

    jmp [bx]

    הצורה הראשונה קופצת לכתובת שנמצאת באוגר,

    השניה קופצת לכתובת שנמצאת בזיכרון במקום שאליו מצביע האוגר

    BX

    #78301
    Sarthobi
    משתתף

    תודה רבה על התשובה והתגובה, אבל לצערי זה לא עוזר.

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

    הנה דוגמה לשורד שאני מנסה להריץ:

     lea bx,check
    check: jmp bx

    שורד שאמור להיות בלולאה אין סופית.. אבל זה רושם לי שהוא מת בפקודה מספר 2

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

    וניסיתי גם בעזרת אוגרים אחרים וזה לא עזר

    תודה שוב על העזרה

    #78299
    DL!
    משתתף

    Sarthobi:

    The engine is an open-source project, so you can easily verify that the "JMP NEAR r16" opcode is indeed implemented correctly.

    I believe the reason your survivor dies, is because BX is not pointing to where you think it is. Remember that the engine loads your survivor to a random memor address (a random offset in the Arena's segment). However, the Assembler you use to compile your code usually assumes that the code will be loaded to a specific offset (for example, COM files are loaded to offset 0x100). What happens is that your first opcode actually translates to
    LEA BX, [0104]
    and then your second opcode tries to jump to offset 0x104, which is usually invalid (hence your survivor dies).

    The engine lets you know where you are loaded by setting the initial value of the AX register. So, the following code should work:

    @start:
    MOV BX, AX   ; point BX to @start
    ADD BX, (offset @check – offset @start) ; point BX to @check
    @check:
    JMP BX ; infinite loop (jumps to @check)

    Notice that in this code the Assembler still assumes the code is loaded to 0x100, but this doesn't matter since we only use the difference between two offsets, which doesn't change even if the code is loaded somewhere else.

    #78294
    Sarthobi
    משתתף

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

    AX

    בלי שום דבר אחר והדבר הזה כן עבד.

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

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