Anweisung in Bytes ?



  • Hi,

    Ich hab mal ne Frage:

    Wird Assembler eigentlich so übersetzt, dass jede Anweisung ein bestimmtes Byte bekommt ?

    Also z.B.

    6F = mov
    CD = int (dass weiß ich bereits)

    etc.

    Ich komm bei mov nie auf was ! Manchmal heißt
    mov ax,0000 E80000 (oder so ähnlich)
    und ein anderes mal
    mov ds,ax B8 04 (oder so ähnlich)

    Wird die Anweisung vielleicht zusammen mit dem 1. Parameter in ein Byte gesteckt, also z.B. 1011 1000 = mov ax ?
    Aber da fand ich auch nicht's richtiges !

    Danke im **Voraus

    PM**



  • kommt auf den Befehl an. Bei manchen ist halt 1 Byte Befehl plus Parameter, wie bei INT, bei manchen ist der Befehl je nach Adressierungsart unterschiedlich, bei manchen gibts für jedes Operandenregister nen eigenen Opcode (ich glaub INC ist für eine ganze Reihe Register ein Ein-Byte Befehl)

    Manchmal brauchste sogar mehrere Bytes nur für den Befehl.



  • Das hängt ziemlich vom Befehl ab. Die einfachste Variante sind Befehle ophne parameter, ret z.B. Die werden meistens durch ein Byte codiert. Genauso werden manche Befehle furch zwei Byte codiert (dann ist das erste meistens 0F oder 0xD8-0xDF).

    So bedeuten 1-2 Bytes alleine den Befehl. Dann müssen die Operanden ja meistens noch irgendwo landen. Gehts nur um eine normale Zahl, wird sie meistens einfach dahintergepackt (z.B. short jmp). Manche Bytes haben auch schon neben einem Befehl gleich einen Operanden mit als Bedeutung, z.B: bedeutet 0x04 add al, Ib, wobei Ib eine zahl ist die im nächsten Byte steht.
    Die komplizierteste Form der Operandenkodierung ist das Mod/Rm-Byte. Dabei steht das Byte hinter dem Befehl je nach Codierung für ein Quell-/Zielregister und eine Speicherstelle/ein zweites Register. Wenns ganz hart kommt, ist auch anstatt des ersten Registers, der Opcode dadrin spezifiziert (beispielsweise deutet 0x80 nur die Parametertypen an, ob es nun add, adc, sub, sbb, and, or, xor oder cmp ist, sagt erst das Mod/Rm aus).
    Rein theoretisch kann vor dem Opcode noch ein Haufen prefixes stehen, die z.B. zwischen 16 und 32-Bit Modus unterscheiden oder ein spezielles Segment angeben, alles in allem kann der extremste Opcode theoretisch 16 Bytes lang sein, aber ab 15 Bytes wirft der Prozessor eine #UD (Invalid Opcode exception).
    Schau dir mal den zweiten Teil von Intels IA32-Doku an, dort steht das alles sehr ausführlich, zu finden unter http://developer.intel.com/design/pentium4/manuals/245471.htm


Anmelden zum Antworten