Assembler: 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
Syntax Gibt die Parameter an
Funktion Mnemonik Name der Funktion
Par1, Par2, Par3 Dient zur Lokalisierung der Parameterinformation
OpCodeHex OpCode in Hex-Code, die ersten Zeichen der Funktion die als Identifikation für den Prozessor dienen
CodePar Parameter Anweisung, gibt an wie mit den Parametern umgegangen wird, also wo sie in die Funktion kopiert werden
Hardware Ab 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 (Lehr 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 ObCodes

CodeTeil Beschreibung
Prefixes Optionaler Präfix. 0 - 4 Bytes lang. () () (66) (67)
Opcode 1 - 3 Bytes Langer OpCode
Mod R/M Optionaler Mode Register Memory Codierung
SIB Optionaler Scale Index Base Codierung
Disp Optionaler Addressen Displacement. 1, 2, 4 Bytes lang
Immediate Optionaler Immediate Konstanten-Wert. 1, 2, 4 Bytes lang

Präfix Byte

Fix Hex Beschreibung
Gruppe 1
LOCK F0 §
REP F3 §
REPE F3 §
REPZ F3 §
REPNE F2 §
REPNZ F2 §
Gruppe 2
CS 2E §
SS 36 §
DS 3E §
ES 26 §
FS 64 §
GS 65 §
Gruppe 3
§ 66 Operandengröße überschreiben
Gruppe 4
§ 67 Adressgröße überschreiben

Register Bits

Bit 08 16 32 Seg FPU MMX XMM CR DR TR
0 AL AX EAX ES ST0 MM0 XMM0 CR0 DR0
1 CL CX ECX CS ST1 MM1 XMM1 DR1
2 DL DX EDX SS ST2 MM2 XMM2 CR2 DR2
3 BL BX EBX DS ST3 MM3 XMM3 CR3 DR3 TR3
4 AH SP ESP FS ST4 MM4 XMM4 CR4 TR4
5 CH BP EBP GS ST5 MM5 XMM5 TR5
6 DH SI ESI ST6 MM6 XMM6 DR6 TR6
7 BH DI EDI ST7 MM7 XMM7 DR7 TR7

Operatoren

Parameter Formate für Operatoren

Parameter Beschreibung
reg8 8-bit allzweck Register CPU
reg16 16-bit allzweck Register CPU
reg32 32-bit allzweck Register CPU
reg_? Register CPU-Festgelegt, ? --> reg_al, reg_ax, reg_ax, reg_eax
segreg Segment Register
imm Generischer immediate Konstanten Operand
imm8 8-bit immediate Konstanten Operand
imm16 16-bit immediate Konstanten Operand
imm32 32-bit immediate Konstanten Operand
mem Generischer Speicher Zeiger
mem8 8-bit Speicher Zeiger
mem16 16-bit Speicher Zeiger
mem32 32-bit Speicher Zeiger
mem64 64-bit Speicher Zeiger
mem80 80-bit Speicher Zeiger
mem128 128-bit Speicher Zeiger
rm8 kurz für reg8/mem8
rm16 kurz für reg16/mem16
rm32 kurz für reg32/mem32
rm64 kurz für mmxreg/mem64
rm128 kurz für xmmreg/mem128
fpureg FPU Stack Register.
fpu0 FPU Stack Register ST0.
mmxreg MMX 64-bit Register.
xmmreg XMM 128-bit Register 3DNow SSE
sbyte §
void Keine Parameter

near §
far §

Vergleichs-Codes cc

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

Kürzel Bit Flag Beschreibung
O 0 OF=1 Overflow
NO 1 OF=0 Not Overflow
C, B, NAE 2 CF=1 Carry, Below, Not Above or Equal
NC, NB, AE 3 CF=0 Not Carry, Not Below, Above or Equal
E, Z 4 ZF=1 Equal, Zero
NE, NZ 5 ZF=0 Not Equal, Not Zero
BE, NA 6 CF=1 or ZF=1 Below or Equal, Not Above
NBE, A 7 CF=0 and ZF=0 Not Below or Equal, Above
S 8 SF=1 Signed
NS 9 SF=0 Not Signed
P, PE A PF=1 Parity, Parity Even
NP, PO B PF=0 Not Parity, Parity Odd
L, NGE C SF <> OF Less, Not Greater or Equal
GE, NL D SF = OF Not Less, Greater or Equal
LE, NG E ZF=1 or (SF <> OF) Less or Equal, Not Greater
G, NLE F ZF=0 and (SF = OF) Not Less or Equal, Greater

Mod R/M Bits

§

Bits 76 543 210
OO RRR MMM


ModR/M Kurz
0 - 2 r/m
3 - 5 reg
6 - 7 mod
Mod r/m 16Bit
r/m mod=00 mod=01 mod=10 mod=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
110 disp16 [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/m mod=00 mod=01 mod=10 mod=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
100 sib sib+disp8 sib+disp32 AH,SP,ESP,MM4,XMM4
101 disp32 [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

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

OpCode Beispiel

WRITEME


 

Assembler/Funktionen/OpCode.txt · Zuletzt geändert: 2008/03/04 18:43 (Externe Bearbeitung)