Simulateur de machine ram
x
0
0
1
+

HEX
DEC

Ordre des opérations à suivre pour l'utilisation de la machine :

CHARGEMENT DU PROGRAMME  Chargement du programme calculant f.
BANDE D'ENTRÉE  Saisie et contrôle de l'instance x.
PROGRAMME  Contrôle de l'exécution du programme.
BANDE DE SORTIE  Sortie et contrôle de y := f(x).

Le fichier à charger doit contenir une instruction du programme par ligne. Chaque instruction peut éventuellement être accompagnée d'un commentaire qui commence par le caractère ;. La bande d'entrée peut être initialisée par la même occasion, si la première ligne du fichier commence par le caractère > suivi d'une liste d'entiers séparés par un espace. Par exemple > -1 12 3 0 1 rangera les entiers \(-1\), \(12\), \(3\), \(0\) et \(1\) dans les \(5\) premières cellules de la bande d'entrée.

Par souci de concision, les instructions en tête de groupe sur fond gris servent de modèles pour celles sur fond noir qui suivent et dont seule la 1ère déclinaison est donnée. Par exemple la décrémentation DEC n a pour autre déclinaison DEC @n.

Entrées/Sorties [READ | WRITE]

READ ACC ← x[i++] copie une valeur de la bande d'entrée dans acc.
WRITE y[i++] ← ACC copie le con­te­nu de acc sur la bande de sortie.

Gestion mémoire [LOAD | STORE]

Chargement [LOAD]

LOAD #n ACC ← n charge la valeur n dans acc.
LOAD n ACC ← R[n] copie le con­te­nu du registre d'ad­res­se \(n\) dans acc.
LOAD @n ACC ← R[R[n]] copie le con­te­nu du registre d'ad­res­se \(R[n]\) dans acc.

Rangement [STORE]

STORE n R[n] ← ACC copie le con­te­nu de acc dans le registre d'ad­res­se \(n\).
STORE @n R[R[n]] ← ACC copie le con­te­nu de acc dans le registre d'ad­res­se \(R[n]\).

Opérations arithmétiques [INC | DEC | ADD | SUB | MUL | DIV | MOD]

Décrémentation / Incrémentation [INC | DEC]

INC n R[n] ← R[n] + 1 incrémente le con­te­nu du registre d'ad­res­se \(n\).
INC @n R[R[n]] ← R[R[n]] + 1 incrémente le con­te­nu du registre d'ad­res­se \(R[n]\).
DEC n R[n] ← R[n] - 1 décrémente le con­te­nu du registre d'ad­res­se \(n\).

Opérations arithmétiques [ADD | SUB | MUL | DIV | MOD]

ADD #n ACC ← ACC + n ajoute la valeur \(n\) à acc.
ADD n ACC ← ACC + R[n] ajoute le con­te­nu du registre d'ad­res­se \(n\) à acc.
ADD @n ACC ← ACC + R[R[n]] ajoute le con­te­nu du registre d'ad­res­se \(R[n]\) à acc.
SUB #n ACC ← ACC - n soustrait la valeur \(n\) à acc.
MUL #n ACC ← ACC × n multiplie la valeur \(n\) à acc.
DIV #n ACC ← ACC / n quotiente acc par la valeur \(n\).
MOD #n ACC ← ACC % n réduit acc modulo la valeur \(n.\)

Ruptures de séquence [JUMP | JUMZ | JUML | JUMG | NOP]

Inconditionnelles

JUMP n CO ← n saut à l'instruction \(n\).
JUMP @n CO ← R[n] saut à l'instruction \(R[n]\).
STOP arrêt du programme.
NOP                     Instruction nulle. Ne fait rien.

Conditionnelles

JUMZ n IF (ACC = 0) CO ← n saut à l'instruction \(n\) si acc=0.
JUMZ @n IF (ACC = 0) CO ← R[n] saut à l'instruction \(R[n]\) si acc=0.
JUML n IF (ACC < 0) CO ← n saut à l'instruction \(n\) si acc<0.
JUMG n IF (ACC > 0) CO ← n saut à l'instruction \(n\) si acc>0.