OpCode

OpCode
OpCodes-CPU
OpCodes-FPU
OpCodes-MMX
OpCodes-Weitere

FIXME Die Listen wurden aus mehreren Quellen zusammengefaßt und wurden noch nicht sorgfältig überprüft.



Der OpCode ist der Binäre Maschinencode der direkt aus der ASM-Funktion abgeleitet wird. Da an jeder ASM-Funktion verschiedene Parameter mit verschiedenen Eigenschaften übergeben werden kann, werden diese Informationen (zB. Register oder Speicherstelle) mit dem OpCode verbunden.
Die Liste kann für einen ASM-Compiler verwendet werden, welcher ASM-Funktionen korrekt in das Binärformat umzuwandeln kann.

OpCode ist die Basis der Funktion, dieser wird vom Prozessor verwendet um den Maschinen-Code zu identifizieren und kann daran dann auch erkennen welche Zusatzinformationen noch dazu gehören. Das mindestens 1 Byte lange erste Zeichen codiert Dabei die ASM-Funktion, nachfolgend werden zusätzliche Informationen über die Parameter wenn nötig angefügt oder als Bites einkopiert.

Im Syntax ist wird angegeben welche Daten-Formate als Parameter akzeptiert werden.

OpCode Listen

Daten-Spalten
SyntaxGibt die Parameter an
FunktionMnemonik Name der Funktion
Par1, Par2, Par3Dient zur Lokalisierung der Parameterinformation
OpCodeHexOpCode in Hex-Code, die ersten Zeichen der Funktion die als Identifikation für den Prozessor dienen
CodeParParameter Anweisung, gibt an wie mit den Parametern umgegangen wird, also wo sie in die Funktion kopiert werden
HardwareAb wann die Funktion unterstützt wird, zB. 386 bedeutet ab 386 und allen Nachfolger Prozessoren unterstützen die Funktion, die Vorgänger nicht.
(Clocks)Gibt Schätzung für die Anzahl des Prozessors Clocks an (Leer bedeutet: wird von diesem Prozessor nicht unterstützt)


(Clocks) --> ist noch nicht enthalten da für jeden Prozessortyp andere Clocks gelten, also müssen mehrere Schätz-Werte eingegeben werden.

Zusätzlich dienen die Clocks dazu, anzuzeigen wie lange der Prozessor ungefähr für die Ausführung der Funktion auf einem Prozessortyp braucht. Dies dient dann auch dem Compiler zum Abschätzen von Laufzeiten oder zum Optimieren des Codes. Ein Clock entspricht einem Prozessor-Tackt. (Die Werte können zwischen Typen und Hersteller variieren und sind also eine Empfehlung und nicht exakt.)

OpCode Berechnung

Über die Angaben aus der ASM-OpCode Listen lässt sich der Binärcode aus dem Mnemonic (ASM-Textcode) berechnen.

Binärzusammensetzung des OpCodes

CodeTeilBeschreibung
PrefixesOptionaler Präfix. 0 - 4 Bytes lang. () () (66) (67)
Opcode1 - 3 Bytes Langer OpCode
Mod R/MOptionaler Mode Register Memory Codierung
SIBOptionaler Scale Index Base Codierung
DispOptionaler Addressen Displacement. 1, 2, 4 Bytes lang
ImmediateOptionaler Immediate Konstanten-Wert. 1, 2, 4 Bytes lang

Präfix Byte

FixHexBeschreibung
Gruppe 1
LOCKF0?+
REPF3?+
REPEF3?+
REPZF3?+
REPNEF2?+
REPNZF2?+
Gruppe 2
CS2E?+
SS36?+
DS3E?+
ES26?+
FS64?+
GS65?+
Gruppe 3
?+66Operandengröße überschreiben
Gruppe 4
?+67Adressgröße überschreiben

Register Bits

Bit081632SegFPUMMXXMMCRDRTR
0ALAXEAXESST0MM0XMM0CR0DR0
1CLCXECXCSST1MM1XMM1DR1
2DLDXEDXSSST2MM2XMM2CR2DR2
3BLBXEBXDSST3MM3XMM3CR3DR3TR3
4AHSPESPFSST4MM4XMM4CR4TR4
5CHBPEBPGSST5MM5XMM5TR5
6DHSIESIST6MM6XMM6DR6TR6
7BHDIEDIST7MM7XMM7DR7TR7

Operatoren

Parameter Formate für Operatoren

ParameterBeschreibung
reg88-bit allzweck Register CPU
reg1616-bit allzweck Register CPU
reg3232-bit allzweck Register CPU
reg_?Register CPU-Festgelegt, ? --> reg_al, reg_ax, reg_ax, reg_eax
segregSegment Register
immGenerischer immediate Konstanten Operand
imm88-bit immediate Konstanten Operand
imm1616-bit immediate Konstanten Operand
imm3232-bit immediate Konstanten Operand
memGenerischer Speicher Zeiger
mem88-bit Speicher Zeiger
mem1616-bit Speicher Zeiger
mem3232-bit Speicher Zeiger
mem6464-bit Speicher Zeiger
mem8080-bit Speicher Zeiger
mem128128-bit Speicher Zeiger
rm8kurz für reg8/mem8
rm16kurz für reg16/mem16
rm32kurz für reg32/mem32
rm64kurz für mmxreg/mem64
rm128kurz für xmmreg/mem128
fpuregFPU Stack Register.
fpu0FPU Stack Register ST0.
mmxregMMX 64-bit Register.
xmmregXMM 128-bit Register 3DNow SSE
sbyte?+
voidKeine Parameter

near ?+
far ?+

Vergleichs-Codes cc

Kürzel Erweiterung für cc, zB. in Jcc oder SETcc.

KürzelBitFlagBeschreibung
O0OF=1Overflow
NO1OF=0Not Overflow
C, B, NAE2CF=1Carry, Below, Not Above or Equal
NC, NB, AE3CF=0Not Carry, Not Below, Above or Equal
E, Z4ZF=1Equal, Zero
NE, NZ5ZF=0Not Equal, Not Zero
BE, NA6CF=1 or ZF=1Below or Equal, Not Above
NBE, A7CF=0 and ZF=0Not Below or Equal, Above
S8SF=1Signed
NS9SF=0Not Signed
P, PEAPF=1Parity, Parity Even
NP, POBPF=0Not Parity, Parity Odd
L, NGECSF <> OFLess, Not Greater or Equal
GE, NLDSF = OFNot Less, Greater or Equal
LE, NGEZF=1 or (SF <> OF)Less or Equal, Not Greater
G, NLEFZF=0 and (SF = OF)Not Less or Equal, Greater

Mod R/M Bits

Bits76 543 210
OO RRR MMM


ModR/MKurz
0 - 2r/m
3 - 5reg
6 - 7mod
Mod r/m 16Bit
r/mmod=00mod=01mod=10mod=11
000[BX+SI][BX+SI+disp8][BX+SI+disp16]AL,AX,EAX,MM0,XMM0
001[BX+DI][BX+DI+disp8][BX+DI+disp16]CL,CX,ECX,MM1,XMM1
010[BP+SI][BP+SI+disp8][BP+SI+disp16]DL,DX,EDX,MM2,XMM2
011[BP+DI][BP+DI+disp8][BP+DI+disp16]BL,BX,EBX,MM3,XMM3
100[SI][SI+disp8][SI+disp16]AH,SP,ESP,MM4,XMM4
101[DI][DI+disp8][DI+disp16]CH,BP,EBP,MM5,XMM5
110disp16[BP+disp8][BP+disp16]DH,SI,ESI,MM6,XMM6
111[BX][BX+disp8][BX+disp16]BH,DI,EDI,MM7,XMM7


Mod r/m 32Bit
r/mmod=00mod=01mod=10mod=11
000[EAX][EAX+disp8][EAX+disp32]AL,AX,EAX,MM0,XMM0
001[ECX][ECX+disp8][ECX+disp32]CL,CX,ECX,MM1,XMM1
010[EDX][EDX+disp8][EDX+disp32]DL,DX,EDX,MM2,XMM2
011[EBX][EBX+disp8][EBX+disp32]BL,BX,EBX,MM3,XMM3
100sibsib+disp8sib+disp32AH,SP,ESP,MM4,XMM4
101disp32[EBP+disp8][EBP+disp32]CH,BP,EBP,MM5,XMM5
110[ESI][ESI+disp8][ESI+disp32]DH,SI,ESI,MM6,XMM6
111[EDI][EDI+disp8][EDI+disp32]BH,DI,EDI,MM7,XMM7

SIB Bits

Wird meist bei Array und String verwendet.
MOV EAX, [Basis+Index*4] als Beispiel

Bits76 543 210
SS III BBB
SIBDaten
0 - 2Basis
3 - 5Index
6 - 7Scalierung
SIB Index
BitsDaten
000[EAX]
001[ECX]
010[EDX]
011[EBX]
100undefiniert
101[EBP]
110[ESI]
111[EDI]
SIB Scale
BitsDaten
00index (oder index*1)
01index*2
10index*4
11index*8

OpCode Beispiel

WRITEME


Assembler/Funktionen/OpCode.txt · Zuletzt geändert: 2010/06/17 07:22 von Runtime-Basic