עבור לתוכן

בעיות הוספה וגישה לזכרון באסמבלר

Featured Replies

פורסם

יש לי שני שורות שעושות לי בעיות

xchg turn,nextTurn

mov game[gameLoction],"wn"

אני מניח שבראשון זה קשור לזה שיש שני משתנים בשני הצדדים, ובשני שזה מחרוזת או הGAMELOCTION (אולי אפשר להכניס רק BX/SI/DI).

השאלה שלי מה אני יכול לעשות כדי לתקן את זה?

עריכה:

וגם

xor xLoction,xLoction

פורסם

בגדול ב-x86 assembly אתה לא יכול לעשות פעולה בין שני שני תאי זכרון, אלא רק בין תא זכרון לרסיסטר (או כמובן שני רגיסטרים).

אתה יכול לעשות משהו בסגנון:


mov eax, [turn]
xchg nextTurn, eax
mov [turn], eax

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

פורסם
  • מחבר

אז אני מניח עונה גם על XOR

ומה עם

mov game[gameLoction],"wn"

פורסם

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

בכל מקרה אי אפשר להזיז מחרוזות שלמות ככה.

פורסם
  • מחבר

מוזר. הוא לא נותן לי שום ארור כשאני עושה

mov bx,"wn"

פורסם

תצטרך לשאול מישהו שזוכר יותר טוב. עד כמה שאני זוכר זה לא חוקי, אבל לך תדע איזה שיפצורים עשו מאז באסמבלר. אולי זה מכניס ל-al את 'n' ול-ah את 'w'.

פורסם

מוזר. הוא לא נותן לי שום ארור כשאני עושה

mov bx,"wn"

פשוט תבדוק בדיבגר מה יש בBX.

פורסם
  • מחבר

במקום זה

mov game[gameLoction],"wn"

שיניתי ל

mov si,gameLoction
mov game[si],"wn"

ועובד

הבעיה הבאה שלי

הZF אחרי הקוד הבא אמור להיות 1 אבל הוא 0, יש בעיה בקוד או שאתה חושבים זה בא ממקום אחר

mov si,gameLoction
cmp game[si-1ah],"em"

הGAME מיוצג אצלי הDW כלומר כל תא הוא בעצם 2 והמערך הוא 12*12 (או בעצם 24*24 אם תרצו).

פורסם

אני לא מכיר את העבודה עם מחרוזות, אבל הZF יהייה 0 רק אם 2 הביטויים שווים(כאילו אתצה מחסר ביניהם).

אם הם לא שווים, הוא יהייה אחד.

פורסם

תגיד מאיפה אתה מביא את הסינטקס הזה של השוואה בין מחרוזת לתא זיכרון ??

פורסם

באופן כללי האסמבלר שהוא עובד איתו נראה מאוד מוזר.

פורסם
  • מחבר

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

מתוך הנחה שאם זה עובד

mov game[si],"em"

אז אין סיבה שזה לא יעבוד

cmp game[si],"em"

או שההנחה מוטעת?

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

UI אם שני הביטויים יהיו שווים הZF יהיה 1. (משום שהתוצאה תהפוך ל0 מה שיהפוך את הZF ל1).

פורסם

למה אתה מניח דבר כזה ולא בודק בזיכרון מה בדיוק קורה ? זה ממש נראה לי לא הגיוני ותקין באסמבלי.

ומה קורה אם המחרוזת היא יותר מ2 בייט ?

פורסם
  • מחבר

השורה הזו

mov game[si],"em"

תקינה.

הוא מכניס לזכרון את הHEXA של כל אות לתא(המערך הוא DW).

בקשר לאורך, אני(המתכנת) היחיד שמכניס ומשווה תמחרוזת. היא תמיד תיהיה שני תווים ובכך תוכנס תושווה לאותם שני תאים סמוכים, או תיהיה תו בודד וגם כאשר יש יחס לתו בודד אני אקדם את מיקום התא באחד ויוסיף לפני BYTE PTR.

אתם יודעים מה אולי אני טועה במיקום, תסתקלו ותגידו לי אם יש טעות באחד החישובים(או האיתחולים).

אמור להצביע על ה wn הראשון משמאל(למעלה).

gameLoction dw 34h 

	game dw 0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh
dw 0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh
dw 0ffffh,0ffffh,"wn","em","wn","em","wn","em","wn","em",0ffffh,0ffffh
dw 0ffffh,0ffffh,"em","wn","em","wn","em","wn","em","wn",0ffffh,0ffffh
dw 0ffffh,0ffffh,"wn","em","wn","em","wn","em","wn","em",0ffffh,0ffffh
dw 0ffffh,0ffffh,"em",0ffffh,"em",0ffffh,"em",0ffffh,"em",0ffffh,0ffffh,0ffffh
dw 0ffffh,0ffffh,0ffffh,"em",0ffffh,"em",0ffffh,"em",0ffffh,"em",0ffffh,0ffffh
dw 0ffffh,0ffffh,"em","bn","em","bn","em","bn","em","bn",0ffffh,0ffffh
dw 0ffffh,0ffffh,"bn","em","bn","em","bn","em","bn","em",0ffffh,0ffffh
dw 0ffffh,0ffffh,"em","bn","em","bn","em","bn","em","bn",0ffffh,0ffffh
dw 0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh
dw 0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh,0ffffh

עולה אחד

sub gameLoction,18h

יורד אחד

add gameLoction,18h

אחד שמאלה

sub gameLoction,2h

אחד ימינה

add gameLoction,2h

פורסם

למה 34h ?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים