| OpCode OpCodes-CPU OpCodes-FPU OpCodes-MMX OpCodes-Weitere 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. | 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 (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.) Über die Angaben aus der ASM-OpCode Listen lässt sich der Binärcode aus dem Mnemonic (ASM-Textcode) berechnen. | 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 |
| 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 |
| 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 |
|---|
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 ?+ 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 |
|---|
| ModR/M | Kurz |
|---|
| 0 - 2 | r/m |
|---|
| 3 - 5 | reg |
|---|
| 6 - 7 | mod |
|---|
| 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 |
|---|
| 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 |
|---|
Wird meist bei Array und String verwendet. MOV EAX, [Basis+Index*4] als Beispiel
| SIB | Daten |
|---|
| 0 - 2 | Basis |
|---|
| 3 - 5 | Index |
|---|
| 6 - 7 | Scalierung |
|---|
| Bits | Daten |
|---|
| 000 | [EAX] |
|---|
| 001 | [ECX] |
|---|
| 010 | [EDX] |
|---|
| 011 | [EBX] |
|---|
| 100 | undefiniert |
|---|
| 101 | [EBP] |
|---|
| 110 | [ESI] |
|---|
| 111 | [EDI] |
|---|
| Bits | Daten |
|---|
| 00 | index (oder index*1) |
|---|
| 01 | index*2 |
|---|
| 10 | index*4 |
|---|
| 11 | index*8 |
|---|
|