Einfache Anweisungscodierung

Oct 07 2020

Nehmen wir die folgende Montageanleitung:

add    %cl,%bl

Dies wird codiert als: 00 cboder 00000000 11001011binär. Wenn man das cbin die ModR / M-Bitfelder einfügt, sieht es so aus:

  1   1   0   0   1   0  1   1
+---+---+---+---+---+---+---+---+
|  mod  |    reg    |    r/m    |
+---+---+---+---+---+---+---+---+

Und wenn wir hier das Registerfeld nachschlagen, erhalten wir:

  • mod: 11(Adressierungsmodus registrieren)
  • reg: 001(cl register)
  • r / m: 011(bl Register)

Und ich glaube, das 000000dsist die addAnweisung, und d=s=0da sie alle Register sind. Ist das ein korrektes Verständnis dafür, wie diese Anweisung codiert ist? Darüber hinaus wäre für das Schema der vollständigen Codierung Folgendes genau (in Bytes, nicht in Bits):

[empty]         0x0         0b11001011     [empty]        [empty]          [empty]
_ _ _ _        _ _             _              _           _ _ _ _          _ _ _ _
Prefix      Instruction    Mod-reg-r/m      Scale       displacement      immediate

Gibt es irgendwelche Dinge, die mir hier fehlen, wenn ich versuche, die Anweisung zu "dekodieren"?

Antworten

2 PeterCordes Oct 08 2020 at 04:14

Ja, sieht richtig aus.

Das allgemeine Muster (für "Legacy" -ALU-Anweisungen, die auf 8086 zurückgehen) für die Codierung op r/m, rvs. op r, r/mund 8-Bit vs. 16/32 Bit verwendet die niedrigen 2 Bits des Opcode-Bytes in einem regulären Muster, ist jedoch nicht erforderlich sich darauf verlassen.

Intel dokumentiert in seinem Handbuch zu Band 2 genau, was für jede Codierung der einzelnen Anweisungen vor sich geht. Siehe addzum Beispiel die Spalte Op / En und die Operandencodierungstabelle . (Siehe auchhttps://ref.x86asm.net/coder64.htmDies gibt auch an, welcher Operand für welchen Opcode welcher ist. Beide teilen Ihnen mit, welche Opcodes ein ModRM-Byte benötigen und welche nicht.

Diese verwenden natürlich die Intel-Syntaxreihenfolge. Sie machen Ihr Leben komplizierter, indem Sie versuchen, Handbüchern und Tutorials zu folgen, während Sie die AT & T-Syntax verwenden, die die Reihenfolge der Operandenliste im Vergleich zu Intel- und AMD-Handbüchern umkehrt.

zB 00 /rwird als Operandencodierung aufgeführtMR , die aus der Tabelle, die wir sehen können, Operand 1 = ist ModRM:r/m (r, w), also gelesen und geschrieben und vom r/mFeld codiert wird . Operand 2 = ModRM:reg (r), es handelt sich also um eine schreibgeschützte Quelle, die vom regFeld codiert wird .

Lustige Tatsache: 00 00ist add [rax], aloder AT & T.add %al, (%rax)

Beachten Sie, dass Sie GAS bitten können, die folgenden Codierungsoptionen auszuwählen: x86 XOR-Opcode-Unterschiede

{load}  add    %cl,%bl        # 02 d9
{store} add    %cl,%bl        # 00 cb

Siehe auch Unterschied zwischen MOV r / m8, r8 und MOV r8, r / m8