ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › שאלה לגבי מנוע ההרצה של השורדים
- This topic has 4 תגובות, 3 משתתפים, and was last updated לפני 16 שנים, 9 חודשים by CodeGuru.
-
מאתתגובות
-
30 בינואר 2008 בשעה 14:45 #76920Sarthobiמשתתף
כמו בכותרת או יותר נכון מה קורה אם..:
ובכן אני סתם מנסה מעט לשחק עם האפשרויות של מנוע התחרות ובודק מה קורה עם כל מיני דברים, במקביל אני בודק את ההרצה של הדברים הללו דרך מערכת ההפעלה ורציתי לשאול פה כדי להבין משהו שאני מעט מתקשה איתו.
אני מנסה להפעיל פקודות קפיצה פשוטה, אך אני רוצה לקפוץ לכתובת הכתובה באוגר, כמו לדוגמא:
Jmp BX
ותהיתי האם האוגר צריך להצביע לכתובת אליה אני רוצה לקפוץ כמו שקפיצה רגילה מצפה לתווית שבעצם היא הכתובת היעד, או שמה אני צריך לעבוד עבור המערכת ולכתוב ישר את הדלתא (ההפרש) בין כתובת הפקודה לכתובת היעד.
אמנם ניסיתי את 2 צורות הקידוד הללו ובמנוע המשחק אף אחת מהשניים לא החזירה את התוצאה הרצויה, אך לעומת זאת מערכת ההפעלה מצליחה "לאכול" את צורת הקידוד הזו.
אז אם אפשר להסביר לי אולי היכן אני טועה או פשוט להסביר לי דרך שבא אני יכול לעקוף בעיה זו (אני יודע שאפשר לקפוץ בעזרת תוויות אך אני רוצה בצורה הזו אם ניתן, ואם לא אז להבהיר זאת בבקשה)
תודה מראש.
30 בינואר 2008 בשעה 23:28 #78303CodeGuruמנהל בפורוםאפשר להשתמש בפקודה
jmp ax
או בצורה
jmp [bx]
הצורה הראשונה קופצת לכתובת שנמצאת באוגר,
השניה קופצת לכתובת שנמצאת בזיכרון במקום שאליו מצביע האוגר
BX
31 בינואר 2008 בשעה 09:06 #78301Sarthobiמשתתףתודה רבה על התשובה והתגובה, אבל לצערי זה לא עוזר.
בדקתי את מה שרשמת עם הפקודה של הקפיצה אך הסביבה של ההרצה עדיין הורגת את השורד הכי פשוט שמשתמש בדבר הזה.
הנה דוגמה לשורד שאני מנסה להריץ:
lea bx,check
check: jmp bxשורד שאמור להיות בלולאה אין סופית.. אבל זה רושם לי שהוא מת בפקודה מספר 2
אז בבקשה אם אפשר תנסו להריץ ולבדוק מה הבעיה פה.. כי זה לא הגיוני שזה לא יעבוד.. זה עובד במערכת ההפעלה..
וניסיתי גם בעזרת אוגרים אחרים וזה לא עזר
תודה שוב על העזרה
31 בינואר 2008 בשעה 15:56 #78299DL!משתתף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.
1 בפברואר 2008 בשעה 01:26 #78294Sarthobiמשתתףכן, אתה צודק, אני עשיתי בדיקה חוזרת אתמול בערב עם השורד שעושה קפיצה ישירות לאוגר
AX
בלי שום דבר אחר והדבר הזה כן עבד.
ובאמת תהיתי למה לפעמים זה כתב לי דברים למקום יחסי להתחלה, אז עכשיו זה הרבה יותר ברור, תודה רבה.
-
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.