הצילו!2

עמוד
מוצגות 8 תגובות – 1 עד 8 (מתוך 8 סה״כ)
  • מאת
    תגובות
  • #77098
    QVB
    משתתף

    האם וכיצדמותר לקפוץ אל כל מקום בקוד וכיצד זה נעשה?
    מדוע קטע הקוד הבא לא עובד?
    mov[0], 0e9fdfeh
       jmp 0;

    כאשר הקוד
    0e9fdfeh
    בשפת מכונה משמעו
    jmp 0

    תודה
    QVB

    #78551
    DL!
    משתתף

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

    לכן השורה
    mov [0], 0e9fdfeh
    אינה חוקית.

    זה משהו שהקומפיילר / אסמבלר שלכם היה אמור לצעוק עליו.

    #78550
    DL!
    משתתף

    עוד נקודה למחשבה:

    ב-8086 פקודת
    JMP
    היא רלטיבית. ז"א, ה"קידוד" שלה בשפת מכונה אומר משהו בסגנון "קפוץ 314 בתים אחורה", ולא "קפוץ לכתובת 0".

    לכן, הבתים
    E9 FD FE
    שאתם משתמשים בהם, יקפצו לכתובת 0 רק אם המעבד מריץ אותם מהכתובת 0x100.

    #78548
    QVB
    משתתף

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

    הבעיה היא בכל מקרה לא ה MOVE אלא ה JMP. האם ניתן לקפוץ אל כל מיקום במקטע הקוד? כ

    #78547
    QVB
    משתתף

    לדוגמא הקוד הבא:

    mov cx,0ffffh
    mov word ptr [bx], 0f3a5h    ; rep stosw
    jmp[bx]

    מדוע אינו עובד?

    #78546
    DL!
    משתתף

    The reason is Endianness issues.

    The code would probably work fine if you change the second opcode to:
    mov word ptr [bx], 0a5f3h   ; rep stosw

    For full details see http://en.wikipedia.org/wiki/Endianness

    #78545
    DL!
    משתתף

    And another thing to consider:

    Notice the difference between

    1. JMP BX
    2. JMP [BX]

    Your code does the second, but I think you mean the first.

    #78544
    QVB
    משתתף

    it doesen't…..nor with settung the bytes one by one,

    something to do with the fact that f3ab is a deifferent opcode. it should be

    00:F3

    01:AB

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