Programmation

Syntaxe

Il y a actuellement 16 instructions assembleurs reconnues par le simulateur. Un code machine est composé d'un mnémonique (ou instruction) et de un ou deux arguments représentant des adresses mémoires. Il y a trois types d'adressage : direct, relatif ou relatif indirect. Une ligne de code source (qui une fois compilée occupe une case mémoire) est donc composée ainsi :


<instruction><type argument 1> <argument 1> <type argument2> <argument 2>


Les arguments (<argument 1> et <argument 2>) étant des adresses, les types d'arguments sont également appelés par la suite les types d'adressage.


Types d'adressage

Il faut savoir que la mémoire est circulaire. De ce fait, toutes les adresses sont relatives à l'instruction courante. Ainsi, on ne parle plus d'adresse 0 par exemple car cela n'a plus de sens. Par contre on dira que l'adresse 1 représente la case suivant l'instruction courante et que l'adresse 0 représente la précédente. Il faut toujours se basé sur une adresse. Or pendant le jeu, on ne connait que l'adresse de l'instruction courante!



Les types d'adressage (types des arguments) sont représentés ainsi :


Adressage direct (ou immédiat) : # désigne une valeur (constante) numérique. Il ne s'agit donc pas d'une adresse mais d'une valeur immédiate. Exemple #1 représente la valeur 1 et pas la case suivante.
Adressage relatif : $ désigne une adresse relative à l'adresse courante.Exemple : 0 est l'adresse courante, 1 est l'adresse qui suit l'adresse courante et -1 est l'adresse qui précède l'adresse courante.
Adressage relatif indirect : @ désigne une case contenant une adresse. Exemple : @1 indique que la case suivante (1) contient l'adresse relative désirée. Ceci est très important pour utilisé des variables

Vous pouvez jeter un oeil au tutorial et l'oeil restant au tableau ci-dessous :


Instructions : les 16 commandements

InstructionType Arg 1Type Arg 2Description
DAT Arg1 Arg2#-----Instruction non exécutable qui définit une constante en mémoire
MOV Arg1 Arg2#$@-$@Arg2 = Arg1 (ou DAT Arg1 si #Arg1).
ADD Arg1 Arg2#$@-$@Arg2 = Arg2 + Arg1.
SUB Arg1 Arg2#$@-$@Arg2 = Arg2 - Arg1.
MUL Arg1 Arg2#$@-$@Arg2 = Arg2 * Arg1.
DIV Arg1 Arg2#$@-$@Arg2 = Arg2 / Arg1 (valeur entière) (mort du processus si Arg1 = 0)..
MOD Arg1 Arg2#$@-$@Arg2 = Arg2 modulo Arg1 (mort du processus si Arg1 = 0).
MIN Arg1 -$@---Arg1 = -Arg1, Arg2=-Arg2.
JMP Arg1 -$@---Saute à l'adresse Arg1.
JMZ Arg1 Arg2-$@-$@Saute à l'adresse Arg1 si Arg2 = 0.
JMG Arg1 Arg2-$@-$@Saute à l'adresse Arg1 si Arg2 > 0.
DJZ Arg1 Arg2-$@-$@Décrémente Arg2 puis saute à l'adresse Arg1 si le résultat est nul.
CMP Arg1 Arg2#$@-$@Compare Arg1 et Arg2 puis saute l'instruction suivante s'ils sont différents.
FORK Arg1 -$@---Crée un processus fils en 1 (adresse suivante) et saute en Arg1.
KILL ------Tue un processus au hasard (sauf lui-même).
RND Arg1 Arg2#$@-$@Arg1 et Arg2(de l'addresse Arg2) = Nombre au hasard compris entre 0 et Arg1 en creant un DAT.

La mémoire a une taille de 1024 cases. Elle est circulaire : la case 0 est "à côté" de la case 1023. La case -1 représente donc la case 1023.
Les nombres (Arg1 et Arg2) sont signés.
Cas particulier de l'instruction DAT : l'adressage est toujours direct, donc le symbole # est toujours utilisé.
Un MOV #x,y crée un DAT x en y. (car le premier argument est adressé directement).



Les commentaires dans le source assembleur sont introduits par le symbole ':' Ce sont des commentaires de fin de ligne, c'est-à-dire que tout ce qui se trouve après est ignoré par le compilateur. Leslignes vides ou bien ne contenant que du commentaire sontignorées (et donc ne provoquent pas d'erreur).



Lors de la compilation les instructions qui ne prennent pas d'argument seront crée avec 2 arguments #0 (ex: KILL sera représenter en mémoire par KILL #0,#0). Pour ceux qui n'ont qu'un seul argument, le deuxième est la copie de la première (ex: JMP $2 sera représenté en mémoire par JMP $2,$2).