Der CopperVM Befehlssatz ist in 8 Kategorien unterteilt, die jeweils einen Bereich von 16 Opcodes (0x00-0xFF) umfassen.
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x00 | HALT | - | VM stoppen und Ausführung beenden |
| 0x01 | NOP | - | Keine Operation (No Operation) |
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x10 | PUSH | Wert auf den Stack legen | |
| 0x11 | POP | - | Obersten Wert vom Stack entfernen |
| 0x12 | DUP | - | Obersten Wert duplizieren |
| 0x13 | SWAP | - | Oberste zwei Werte auf dem Stack tauschen |
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x20 | MOV_AX | Wert in Register AX laden | |
| 0x21 | MOV_BX | Wert in Register BX laden | |
| 0x22 | MOV_CX | Wert in Register CX laden | |
| 0x23 | MOV_DX | Wert in Register DX laden |
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x24 | PUSH_AX | - | Wert von AX auf Stack legen |
| 0x25 | PUSH_BX | - | Wert von BX auf Stack legen |
| 0x26 | PUSH_CX | - | Wert von CX auf Stack legen |
| 0x27 | PUSH_DX | - | Wert von DX auf Stack legen |
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x28 | POP_AX | - | Obersten Stack-Wert nach AX kopieren |
| 0x29 | POP_BX | - | Obersten Stack-Wert nach BX kopieren |
| 0x2A | POP_CX | - | Obersten Stack-Wert nach CX kopieren |
| 0x2B | POP_DX | - | Obersten Stack-Wert nach DX kopieren |
| Opcode | Mnemonic | Operanden | Beschreibung | Flags |
|---|---|---|---|---|
| 0x40 | ADD | - | Addition (pop b, pop a, push a+b) | ZF, NF, CF, OF |
| 0x41 | SUB | - | Subtraktion (pop b, pop a, push a-b) | ZF, NF, CF |
| 0x42 | MUL | - | Multiplikation (pop b, pop a, push a*b) | ZF, NF, OF |
| 0x43 | DIV | - | Division (pop divisor, pop dividend, push quotient) | ZF, NF, CF, OF |
| 0x44 | MOD | - | Modulo (pop divisor, pop dividend, push rest) | ZF, NF, OF |
| 0x45 | INC_AX | - | Register AX um 1 erhöhen | ZF, NF, OF |
| 0x46 | DEC_AX | - | Register AX um 1 verringern | ZF, NF |
- ZF (Zero Flag): Ergebnis ist 0
- NF (Negative Flag): Ergebnis ist negativ
- CF (Carry Flag): Übertrag/Unterlauf oder Rest vorhanden
- OF (Overflow Flag): Arithmetischer Überlauf oder Division durch 0
| Opcode | Mnemonic | Operanden | Beschreibung | Flags |
|---|---|---|---|---|
| 0x50 | AND | - | Bitweises UND (pop b, pop a, push a&b) | ZF, NF |
| 0x51 | OR | - | Bitweises ODER (pop b, pop a, push a|b) | ZF, NF |
| 0x52 | XOR | - | Bitweises XOR (pop b, pop a, push a^b) | ZF, NF |
| 0x53 | NOT | - | Bitweises NICHT (pop a, push ~a) | ZF, NF |
| 0x54 | CMP | - | Vergleich (pop b, pop a, berechne a-b, setze Flags) | ZF, NF, CF |
Hinweis: CMP funktioniert wie SUB, legt aber kein Ergebnis auf den Stack - nur Flags werden gesetzt.
| Opcode | Mnemonic | Operanden | Beschreibung | Bedingung |
|---|---|---|---|---|
| 0x60 | JMP | Unbedingter Sprung zu Adresse | - | |
| 0x61 | JZ | Sprung wenn Zero Flag gesetzt | ZF = 1 | |
| 0x62 | JNZ | Sprung wenn Zero Flag nicht gesetzt | ZF = 0 | |
| 0x63 | JG | Sprung wenn größer | ZF = 0 && NF = 0 | |
| 0x64 | JL | Sprung wenn kleiner | NF = 1 | |
| 0x65 | CALL | Funktionsaufruf (PC auf Stack, springe zu addr) | - | |
| 0x66 | RET | - | Rücksprung (pop Adresse vom Stack, springe dorthin) | - |
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x70 | LOAD | Wert aus Speicheradresse laden und auf Stack legen | |
| 0x71 | STORE | Obersten Stack-Wert in Speicheradresse schreiben | |
| 0x72 | LOAD_IND | - | Indirekte Adressierung: AX enthält Adresse, Wert auf Stack |
| 0x73 | STORE_IND | - | Indirekt speichern: AX enthält Adresse, Stack-Wert speichern |
| Opcode | Mnemonic | Operanden | Beschreibung |
|---|---|---|---|
| 0x80 | PRINT_AX | - | Inhalt von Register AX ausgeben |
| 0x81 | PRINT_STACK | - | Obersten Stack-Wert ausgeben (ohne pop) |
| 0x82 | READ | - | Benutzereingabe einlesen und in AX speichern |
PUSH 10 ; 0x10 0x0A - push 10 to Stack
PUSH 20 ; 0x10 0x14 - push 20 to Stack
ADD ; 0x40 - addition
POP_AX ; 0x28 - pop AX from Stack
PRINT_AX ; 0x80 - print AX
HALT ; 0x00 - halt
MOV_AX 5 ; 0x20 0x05 - set Counter to 5
PUSH_AX ; 0x24 - AX on Stack
PRINT_STACK ; 0x81 - Print Actual Value
DEC_AX ; 0x46 - AX decrement
PUSH_AX ; 0x24 - AX on Stack
PUSH 0 ; 0x10 0x00 - push 0 to Stack
CMP ; 0x54 - Compare CX with 0
JNZ 0 ; 0x62 0x03 - Jump back when AX != 0
HALT ; 0x00
CALL 6 ; 0x65 0x06 - jump to Address 6
HALT ; 0x00 - halt
NOP ; 0x01 - no operation
NOP ; 0x01 - no operation
NOP ; 0x01 - no operation
Function by Address 6
PUSH 42 ; 0x10 0x2A - push 42 to Stack
POP_AX ; 0x28 - pop AX from Stack
PRINT_AX ; 0x80 - print AX
RET ; 0x66 - return
MOV_AX 1000 ; 0x20 0x03E8 - set AX to 1000
PRINT_AX ; 0x80 0x01 - print AX
READ ; 0x80 0x03 - read user input
PUSH_AX addr 5 ; 0x24 - push AX to Stack
READ ; 0x80 0x03 - read user input
PUSH_AX ; 0x24 - push AX to Stack
ADD ; 0x40 - addition
POP_AX ; 0x28 - pop AX from Stack
PRINT_AX ; 0x80 0x01 - print AX
JMP addr 5 ; 0x60 0x04 - jump to Address 5
Reservierte Bereiche für zukünftige Erweiterungen:
- 0x07-0x0F: Erweiterte Systemsteuerung
- 0x14-0x1F: Erweiterte Stack-Operationen
- 0x2C-0x3F: Weitere Register-Operationen
- 0x47-0x4F: Erweiterte Arithmetik (Shift, Rotate)
- 0x55-0x5F: Erweiterte Logik
- 0x67-0x6F: Weitere Sprungbefehle
- 0x74-0x7F: Erweiterte Speicheroperationen
- 0x83-0x8F: Erweiterte I/O
- 0x90-0xFF: Frei für spezielle Operationen
- Register: AX, BX, CX, DX (General Purpose)
- Flag Register: ZF, CF, NF, OF
- Program Counter (PC): Zeigt auf aktuelle Instruktion
- Stack: LIFO-Datenstruktur
- Memory: 1024 Worte (konfigurierbar)
CopperVM © 2025