Opcodes verstehen



  • Hallo.
    Ich programmiere auf meinem AMD64 unter Linux mit Fasm. Nun schaue ich mir bei Problemen gerne mal das ausführbare Programm mit einem Hexeditor an. Dabei bin ich auf folgende - für mich unverständliche - Befehle gestoßen: mov rax, 4 wird mit 0x48 0xc7 0xc0 0x04 0x00 0x00 0x00 übersetzt.

    Die letzten 4 Bytes stellen wohl die 4 als 32-Bit Wert dar. Aber die ersten drei Bytes verstehe ich nicht. Der normale 64bit-Befehl, um ein rax zu füllen, wäre 0x48 0xb8 gefolgt von einem 64-Bit Wert. Solange der Wert aber auch mit 32-Bit darstellbar ist, nutzt Fasm die oben beschriebene Variante, vermutlich um Platz zu sparen.

    Ich habe auch schon bei http://sandpile.org nachgeschaut, was die Bytes 0x48 0xc7 0xc0 bedeuten könnten, aber ohne Erfolg. 0x48 könnte der hier erwähnt REX-Befehl sein. Und bei 0xc7 könnte ich mir hier Gruppe #12 vorstellen, die leider nicht weiter beschrieben wird. 0xc0 steht vielleicht für das 32Bit-Register eax, denn wenn ich z.B. mov rbx,4 assemblieren, kommt 0xc3 statt 0xc0.

    Es würde mich also freuen, wenn mir jemand bei der Interpretation der Bytes 0x48 0xc7 0xc0 helfen könnt. Eine andere, gute Opcode-Spezifikation wäre sicher auch hilfreich.



  • probiers halt mal mit einem disassembler



  • Overflow schrieb:

    Eine andere, gute Opcode-Spezifikation wäre sicher auch hilfreich.

    Wieso nimmst du nicht die "offizielle" Doku vom AMD?

    Wie du hier lesen kannst, ist 0x48 ein REX-Prefix-Byte, das die operand size auf 64 Bit setzt. Schaut man in der Datei unter immediate values, findet man nur einen kurzen Verweis auf ein anderes Dokument. Dort steht auf Seite 47:

    When the operand size of a MOV instruction is 64 bits, the
    processor sign-extends immediates to 64 bits before using them.

    Da dein immediate value 32 Bit hat, wird er also erstmal auf 64 Bits erweitert und dann ins 64-Bit-Register geschoben.

    p.s.: Im ersten Dokument steht übrigens auch, dass 0xC7 eine ganz normale MOV-Anweisung ist. Im selben Dokument auf Seite 400 findest du die Antwort zu deiner zweiten Frage, was 0xC0 bzw. 0xC3 bedeutet.


Anmelden zum Antworten