מישהו יכול לתת קוד דוגמה להעברת תוכן אוגר למקטע המשותף לשורדים?

עמוד

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

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

    שאלה בכותרת

    #78305
    rahamim
    משתתף

    כתיבה באמצעות stosw.

    קריאה באמצעות lodsw.
    שים לב שתצטרך לקבוע את ds כes מכיוון שlodsw קורא מהכתובת שנמצאת באוגרים ds:si.
    כלומר
    push es
    pop ds
    lodsw

    #78304
    Sarthobi
    משתתף

    אני מצטער לומר אבל אל אף שהכוונה טובה בהערה מעליי, קשה מעוד להסיק ממנה את המידע הדרוש.

    האמת היא שקראתי כאן בהרבה מקומות והתגובות לרוב מתומצתות מדי ואפשר להשקיע הרבה יותר בתגובה.

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

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

    לפי מה שאני הבנתי כדי לקרוא /לכתוב אל הזיכרון המשותף כדאי להשתמש בפעולות כמו:

    lodsw

    stosw

    ופעולות אלה משתמשות באוגרים:

    SI

    DI

    בהתאמה וכותבים/קוראים מאוגר

    AX

    האם ישנן דרכים אחרות לכתיבה/קריאה מסגמנט הקוד לסגמנט המשותף? (לא מדבר בהכרח על יעילות או קלות למרות שתמיד עדיף שיהיה קל ויעיל [: )

    #78300
    DL!
    משתתף

    Sarthobi:

    A workaround for the English/Hebrew problems: copy the text, paste to Notepad and press right ctrl+shift.

    Rahamim's comment is correct. To read more about the LODSW and STOSW opcodes, try searching them in Google (the first result explains exactly what each of them does).

    Generally speaking, there are several ways to read and write to the memory in 8086 assembly. The important thing to notice here, is that you need to access memory that is in a different segment than CS and DS (in fact, it is pointed to by ES). Since most opcodes that access memory assume it is in the segment pointed to by DS, you usually need to set DS to ES before executing them (like Rahamim did: PUSH ES and then POP DS). After you do so, you can use any opcode you like. For example, calling
    MOV WORD PTR [0000], AA55
    will write AA55 to the first word in the segment, and
    MOV AX, WORD PTR [0000]
    will read it to the AX register.

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

    עוד הערה קטנה – הדרך המקובלת בשפת סף (אסמבלי) לפנות למקטע (סגמנט) אחר היא, למשל,

    mov es:[1000],ax

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

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