Documentation

Tutorial

ADRESSAGE DAT MOV ADD SUB MUL DIV MOD MIN JMP JMZ JMG DJZ CMP FORK KILL RND



Comment comprendre le tutorial ?

Tout d'abord, pour bien comprendre les instructions, il faut déjà apprendre tout les modes d'adressages.
Pour cela, nous avons essayons de vous rendre le plus clair possible toutes les instructions possibles. Dans tout le long du tutorial, nous avons utilisé la syntaxe suivante :
En bleu, tout ce qui a été modifié par l'instruction en cours.
-> indique la position de l'instruction courante.
*a* indique l'état de la case mémoire 'a' après l'exécution de l'instruction courante.
Et très important, la case de destination sera toujours la case pointée par le second argument.

Rq: seule la première instruction est testé. Toutes les autres ne servent qu'à illustrer son action.



Adressage

Relatif : ($)

Cela désigne une adresse relative à l'adresse courante. Exemple: 1 représente l'adresse qui suit l'adresse courante et -1 l'adresse qui précède l'adresse courante. Généralisons ce résultat, nous obtenons ainsi :

AdresseInstructionsCommentaire
->a$bposition courante = a
......-
-->a+b.$b pointe à l'adresse a+b

Relatif indirect : (@)

Désigne une case contenant une adresse. Exemple: @1 indique que la case suivant (1) contient l'adresse relative désirée. Généralisons ce cas comme précédemment :
Ici, @b pointe la case d'adresse a+b+c.

AdresseInstructionsCommentaire
->a@bposition courante = a
......-
a+b%ccase pointé par l'instruction courante a + b
......-
-->a+b+c...%c pointe à l'adresse a+b+c

Rq: ici le % doit être remplacé un mode d'adressage quelconque, soit :#, $ ou @ .
De plus, pour la case contenant l'adresse désirée (dans l'exemple ci-dessus: la case a+b), on se sert toujours du second argument pour trouver l'adresse désirée.
Par exemple :


AdresseInstructionsCommentaire
->0XXX @1,@2L'argument 1 pointe vers la case 3 et l'argument 2 pointe vers la case 4
1XXX #1,#2Cette case pointe la case 3 (0+1+2)
2XXX #1,#2Cette case pointe la case 4 (0+2+2)

retour au début

Dat (1 coup d'horloge)

AdresseInstructionsCommentaire
->0DAT #666,#666Un processus lisant cette instruction est tué

Rq: ces cases peuvent egalement servir à stocker des variables.



retour au début

MOV (1 coup d'horloge)

L'instruction MOV a deux significations :
1/ Si le type du premier argument est immédiat (#), l'instruction MOV crée un DAT (ce qui peut tué un processus). Par exemple :


AdresseInstructionsCommentaire
->0MOV #15,$acree un DAT a*cases plus loin car le type de l'argument 1 est immédiat
......-
aDAT #15,#15Un processus lisant cette instruction est tué

2/ Si le type du premier argument n'est pas immédiat (relatif ou relatif indirect), l'instruction MOV recopie la case pointée par le premier argument sur la case pointée par le deuxième argument. Par exemple :


AdresseInstructionsCommentaire
->0MOV $b,$aCette instruction copie la case b dans la case a
......-
bXXX $5,@1C'est la case qui sera recopié
......-
aXXX $5 @1C'est la case qui vient d'être modifié

retour au début

ADD (1 coup d'horloge)

L'instruction ADD a également deux significations :
1/ Si le type du premier argument est immédiat (#), l'instruction ADD ajoute aux 2 arguments de la case de destination (case pointée par le second argument) la valeur du premier argument. Par exemple :


AdresseInstructionsCommentaire
->0ADD #5,$3Ajoute 5 aux deux arguments de la case 3
......-
3MOV $2,$6Valeur de la case 3 avant modification
*3*MOV $7,$11Valeur de la case 3 après modification

2/ Si le type du premier argument n'est pas immédiat (relatif ou relatif indirect), l'instruction ADD ajoute à la case de destination la case pointée par le premier argument terme à terme. Par exemple :


AdresseInstructionsCommentaire
->0ADD $1,@1Ajoute la case 1 à la case pointée par le deuxième argument soit 3 ici car le
1MOV $1,$2deuxième argument est de type relatif indirect
2...-
3DAT #5,#5Valeur de la case 3 avant modification
*3*DAT #6,#7Valeur de la case 3 après modification

retour au début

SUB (1 coup d'horloge)

L'instruction SUB marche de la même manière que ADD, donc on ne va pas s'attarder dessus. La seule différence c'est que celle ci soustraie au lieu d'ajouter.



retour au début

MUL (1 coup d'horloge)

L'instruction MUL marche de la même manière que ADD, donc on ne va pas s'attarder dessus. La seule différence c'est que celle ci multiplie au lieu d'ajouter.



retour au début

DIV (1 coup d'horloge)

L'instruction DIV marche de la même manière que ADD, donc on ne va pas s'attarder dessus. Les différences sont que celle ci divise au lieu d'ajouter et que en cas de division par 0 le programme est tué.



retour au début

MOD (1 coup d'horloge)

L'instruction MOD marche de la même manière que ADD, donc on ne va pas s'attarder dessus. La seule différence c'est que celle ci fait le modulo (reste de la division euclidienne).



retour au début

MIN (1 coup d'horloge)

Cette instruction retourne l'opposé de chaque argument de la case pointée par le premier argument. Par exemple :


AdresseInstructionsCommentaire
->0MIN $2Inverse les arguments de la case 2
1...-
2DAT #5,#5Valeur de la case 2 avant modification
*2*DAT #-5,#-5Valeur de la case 2 après modification

retour au début

JMP (1 coup d'horloge)

Cette instruction indique au processus de sauter sur la case pointée par le premier argument, au lieu que le processus n'exécute la prochaine instruction. Par exemple :


AdresseInstructionsCommentaire
->0JMP $aLe processus sautera sur la case 'a' au lieu de sauter sur la case 1
1ADD #4,$5-
......-
aXXX ...Le processus exécutera cette instruction au lieu de ADD #4,$5

retour au début

JMZ (1 coup d'horloge)

L'instruction JMZ permet de faire sauter le processus comme l'instruction JMP mais celle-ci ajoute une condition pour sauter. Plus exactement, le processus sautera sur la case pointée par le second argument seulement si la case pointée par le premier a ses deux arguments nuls. Prenons deux exemples pour illustrer cette instruction :


AdresseInstructionsCommentaire
->0JMZ $a,$1Le processus sautera sur la case 'a' au lieu de sauter sur la case 1
1DAT #0,#0car les deux arguments de la case 1 sont nuls
......-
aXXX ...Le processus exécutera cette instruction au lieu de DAT #0,#0
AdresseInstructionsCommentaire
->0JMZ $a,$2Le processus ne sautera pas sur la case 'a' car
1...le premier argument de la case 2 n'est pas nulle
2MOV &1,$0Le premier argument n'est pas nul
......-
aXXX ...-

retour au début

JMG (1 coup d'horloge)

L'instruction JMG permet de faire sauter le processus comme l'instruction JMP mais celle-ci ajoute une condition pour sauter. Plus exactement, le processus sautera sur la case pointée par le second argument seulement si la case pointée par le premier a ses deux arguments > 0. Prenons deux exemples pour illustrer cette instruction :


AdresseInstructionsCommentaire
->0JMG $a,$1Le processus sautera sur la case 'a' au lieu de sauter sur la case 1
1ADD #2,$3car les deux arguments de la case 1 sont > 0
......-
aXXX ...Le processus exécutera cette instruction au lieu de ADD #2,$3

AdresseInstructionsCommentaire
->0JMG $a,$2Le processus ne sautera pas sur la case 'a' car le deuxième argument de
1...la case 2 n'est pas > 0
2MOV &1,$-5-
......-
aXXX ...-

retour au début

DJZ (2 coups d'horloge)

Cette instruction décrémente les deux arguments de la case pointée par le premier argument. Puis si le résultat est nul, alors on saute sur la case pointée par le deuxième argument. C'est donc pourquoi cette instruction prend deux coups d'horloge. Illustrons cette instruction par deux exemples :


AdresseInstructionsCommentaire
->0DJZ $a,$2Le processus sautera sur la case 'a' car les deux arguments de
1...a case 2 vaut 1 (ainsi, en les décrémentant, ils vaudront 0)
2MOV #1,$1Etat de la case avant la modification
*2*MOV #0,$0Etat de la case après la modification
......-
aXXX ...Le processus sautera sur cette case

AdresseInstructionsCommentaire
->0DJZ $a,$2Le processus ne sautera pas sur la case 'a' car le deuxième argument de
1...la case 2 vaudrat 4.
2MOV #1,$5Etat de la case avant la modification
*2*MOV #0,$4Etat de la case après la modification
......-
aXXX ...Le processus ne sautera pas sur cette case

retour au début

CMP (1 coup d'horloge)

Cette instruction s'utilise de deux manières différentes :
1/ Si le type du premier argument est immédiat (#), l'instruction CMP compare le premier argument avec les deux arguments de la case pointée par le deuxième arguments. Si ceux-ci sont égaux alors le processus continu son train train habituelle sinon il saute la case suivante pour se trouver sur la case 2. Par exemple :


AdresseInstructionsCommentaire
->0CMP #5,$5Le processus ne sautera pas à la case 2 car les deux arguments de
1...la case 3 sont égaux.
2...-
3DAT #5,#5-

AdresseInstructionsCommentaire
->0CMP #5,$5Le processus sautera à la case 2 car les deux arguments de
1...la case 3 ne sont sont égaux.
2XXX ...Le processus sautera sur cette case
3DAT #5,#7-

2/ Si le type du premier argument est n'est pas immédiat (relatif ou relatif indirect), l'instruction CMP compare la case pointée par le premier argument avec la case pointée par le deuxième arguments. Si ceux-ci sont égaux (type d'adressage inclus) alors le processus continu son train train habituelle sinon il saute la case suivante pour se trouver sur la case 2. Par exemple :


AdresseInstructionsCommentaire
->0CMP $4,$3Le processus ne sautera pas sur la case 2 car le type d'adressage du premier
1...argument diffère par rapport à l'autre. Donc le processus continue sa marche
2...habituelle.
3MOV #1,#1-
4MOV #1,$1-

retour au début

FORK (12 coups d'horloge)

Pour moi, cette instruction est sans doute la plus importante de toute car celle ci permet au guerrier de se multiplié et donc de prendre un grand avantage sur d'autres. Plus exactement cette instruction crée un nouveau processus sur la case 1 et l'ancien saute sur la case pointée par le premier argument. Par contre, cette instruction met 12 coups d'horloge ce qui compense bien son efficacité. Prenons l'exemple ci-dessous :


AdresseInstructionsCommentaire
->0FORK $aLe nouveau processus sera crée sur la case 1
1XXX ...le nouveau processus commence ici
......-
aXXX ...le processus pére sautera sur cette case.

Remarque : le simulateur n'accepte que 64 processus au maximum donc les instructions qui suivront ne feront que perdre du temps au processus. Cette limitation est importante car on est vite débordé par le nombre de processus.



retour au début

KILL (36 coups d'horloge)

Cette instruction est la deuxième plus importante de toutes car celle-ci tue au bout de 36 coups d'horloge un processus au hasard sauf lui-même. Donc, rien n'empêche à cette instruction de tuer un processus appartenant au même joueur.



retour au début

RND (1 coup d'horloge)

Cette instruction envoie un DAT #a,#a sur la case pointée par le deuxième argument. De plus, a est un nombre choisi aléatoirement entre 0 et la valeur du premier argument - 1. Par exemple :


AdresseInstructionsCommentaire
->0RND #b,$aCrée un DAT sur la case a
......-
aXXX ...-
*a*DAT #c #coù c représente un nombre compris entre 0 et b-1

Remarque : le type d'adressage du premier argument peut être quelconque.



retour au début