Frage zu Opcode-Aufbau



  • Hallo!

    Und zwar steht im Datasheet zum 8086 (z.B) folgendes zum ADD-Befehl (<-z.B.):

    1.Byte 2.B 3.B 4.B
    | 100000sw | mod000r/m | data | data if s:w=01 |

    Da steht als erläuterung zu den #sw# bits:

    "If s:w=11 then an immediate data byte is sign extended to form the 16
    bit operand."

    Ich verstehe den Sinn nicht ganz, heißt das es kriegt ein "vorzeichen"
    (das Byte)und wird dadurch 16 bit erweitert oder wie?

    Hab ma unter Debug probiert da wird aus "add word ptr[si+12],-45" z.B, der
    code "834412BB" generiert wobei ich laut oberer Beschreibung eigenlicht
    2 Byte am Ende erwarten würde wegen "-45"(imm), also so wie "FFBB" und nicht nur "BB" ... wo sind da 16bit (imm)?

    Also wie soll ich den Satz verstehen?

    Danke für evtl. Antworten!!



  • kwark schrieb:

    Ich verstehe den Sinn nicht ganz, heißt das es kriegt ein "vorzeichen"
    (das Byte)und wird dadurch 16 bit erweitert oder wie?

    Ohne das jetzt gegengecheckt zu haben: Ja, so in etwa wuerde ich das auch verstehen. Tatsaechlich laeuft das so, dass das hoechste Bit (wird oft als Vorzeichen=Sign-Bit interpretiert) 8 mal angehaengt wird, um einen 16Bit-Wert zu bilden.

    kwark schrieb:

    Hab ma unter Debug probiert da wird aus "add word ptr[si+12],-45" z.B, der
    code "834412BB" generiert wobei ich laut oberer Beschreibung eigenlicht
    2 Byte am Ende erwarten würde wegen "-45"(imm), also so wie "FFBB" und nicht nur "BB" ... wo sind da 16bit (imm)?

    Das ist doch gerade der Witz an dieser Erweiterung. 🙂
    Du hast da nur einen 8Bit-Imm stehen (spart Platz), der beim Rechnen dann jedoch intern auf einen 16Bit-Wert aufgeblasen wird. Der x86 kann allgemein naemlich immer nur 2 gleich breite Operanden addieren. Wenn du also als Zieloperanden ein word hast, muss der 2. Operand auch 16Bit breit sein. Entweder ist er es dann eh schon, oder wird wie in diesem Beispiel eben intern erweitert.


Log in to reply