Ein Malbolge-Programm wird in einem Speicher aus 3^10 Zellen ausgeführt. Jeder Speicherzelle enthält einen Wert zwischen 0 und 59048.
Für die Ausführung werden drei Register benötigt:
- C ist der Befehlszeiger, der auf den aktuell auszuführenden Befehl zeigt. Das Register wird nach jedem Befehl automatisch erhöht.
- D ist der Daten-Zeiger, der auf den aktuell zu bearbeitenden Wert zeigt. Das Register wird nach jedem Befehl automatisch erhöht.
- A ist das Register, das für die Datenein- und ausgabe genutzt wird.
Programmausführung
Laden des Programms
Beim Laden des Programms werden Leerzeichen, Tabulatoren und Zeilenumbrüche ignoriert. Beim Beschreiben der Speicherzellen wird geprüft, ob es sich um einen gültigen Befehl handelt. Wenn nicht, wird die Ausführung abgebrochen.
Sollte beim Schreiben der Speicherbereich überschritten werden, wird die Programmausführung abgebrochen.
Nach dem Einlesen des Programms wird der verbleibende Speicherbereich mit der Crazy-Funktion gefüllt.
Initialisieren der Register
Die Register C, D und A werden auf 0 gesetzt.
Ausführen des Programm
- Lesen der Speicherzelle C
- Prüfen auf Gültigkeit
- Ausführen des Befehls
- Verschlüsseln der Speicherzelle C
- Erhöhen von C und D
Befehle
Befehl | Beschreibung | ||
i | 4 | jump [D] | Setzt den Inhalt des Befehlszeigers C auf [D] |
< | 5 | out A | Gibt den Inhalt von A als ASCII-Zeichen aus |
/ | 23 | in A | Liest ein Zeichen und legt den ASCII-Wert in A ab |
* | 39 | rot [D] mov A, [D] | Rotiert den Inhalt der Speicherzelle [D] um eine Stelle nach rechts und legt das Ergebnis in A ab |
j | 40 | movd D, [D] | Kopiert den Inhalt der Speicherzelle [D] nach D |
p | 62 | D = crazy A, [D] mov A, [D] | Wendet die crazy-Funktion auf den Inhalt der Speicherzelle [D] sowie den Wert in A an |
0 | 68 | nop | Keine Funktion |
v | 81 | halt | Beendet das Programm |