04 Comment est structuré un programme Malbolge ?

Spécificité de Malbolge (lscheffer.com)

Un programme Malbolge est exécuté dans une mémoire de 3^10 cellules. Chaque cellule de la mémoire contient une valeur comprise entre 0 et 59048.

Trois registres sont nécessaires pour l’exécution :

C est le pointeur d’instruction pointant vers l’instruction courante à exécuter. Le registre est automatiquement incrémenté après chaque instruction.
Dest le pointeur de données pointant sur la valeur courante à traiter. Le registre est automatiquement incrémenté après chaque commande.
A est le registre utilisé pour l’entrée et la sortie des données.

Exécution du programme

Chargement du programme

Lors du chargement du programme, les espaces, les tabulations et les sauts de ligne sont ignorés. Lors de l’écriture dans les cellules de mémoire, il est vérifié s’il s’agit d’une commande valide. Si ce n’est pas le cas, l’exécution est interrompue.

Si la zone de mémoire est dépassée pendant l’écriture, l’exécution du programme est interrompue.

Après la lecture du programme, la zone de mémoire restante est remplie par la fonction Crazy.

Initialisation des registres

Les registres C, D et A sont initialisés à 0,

Exécuter le programme

  • La lecture de la cellule mémoire C
  • Le contrôle de validité
  • Exécuter la commande
  • Encrypter la cellule mémoire C
  • Incrémenter C et D

Commandes

CommandeExplication
i4jump [D]Copie la valeur de C vers [D].
<5out AImprime la valeur de A, en tant que caractère ASCII, à l’écran.
/23in AIntroduit un caractère, sous forme de code ASCII, dans A.
*40rot [D]
mov A, [D]
Fait pivoter la valeur en [D] d’un chiffre ternaire. Stocke le résultat à la fois en [D] et en A.
j68mov D, [D]Copie la valeur de [D] sur D.
p39D = crazy A, [D]
mov A, [D]
Effectue l’opération folle avec la valeur de [D] et la valeur de A. Stocke le résultat à la fois sur [D] et dans A.
o62nopNe fait rien
v81haltFin du programme Malbolge