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 :
Adresse | Instructions | Commentaire |
---|---|---|
->a | $b | position 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.
Adresse | Instructions | Commentaire |
---|---|---|
->a | @b | position courante = a |
... | ... | - |
a+b | %c | case 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | XXX @1,@2 | L'argument 1 pointe vers la case 3 et l'argument 2 pointe vers la case 4 |
1 | XXX #1,#2 | Cette case pointe la case 3 (0+1+2) |
2 | XXX #1,#2 | Cette case pointe la case 4 (0+2+2) |
retour au début
Dat (1 coup d'horloge)
Adresse | Instructions | Commentaire |
---|---|---|
->0 | DAT #666,#666 | Un 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | MOV #15,$a | cree un DAT a*cases plus loin car le type de l'argument 1 est immédiat |
... | ... | - |
a | DAT #15,#15 | Un 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | MOV $b,$a | Cette instruction copie la case b dans la case a |
... | ... | - |
b | XXX $5,@1 | C'est la case qui sera recopié |
... | ... | - |
a | XXX $5 @1 | C'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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | ADD #5,$3 | Ajoute 5 aux deux arguments de la case 3 |
... | ... | - |
3 | MOV $2,$6 | Valeur de la case 3 avant modification |
*3* | MOV $7,$11 | Valeur 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | ADD $1,@1 | Ajoute la case 1 à la case pointée par le deuxième argument soit 3 ici car le |
1 | MOV $1,$2 | deuxième argument est de type relatif indirect |
2 | ... | - |
3 | DAT #5,#5 | Valeur de la case 3 avant modification |
*3* | DAT #6,#7 | Valeur 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | MIN $2 | Inverse les arguments de la case 2 |
1 | ... | - |
2 | DAT #5,#5 | Valeur de la case 2 avant modification |
*2* | DAT #-5,#-5 | Valeur 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | JMP $a | Le processus sautera sur la case 'a' au lieu de sauter sur la case 1 |
1 | ADD #4,$5 | - |
... | ... | - |
a | XXX ... | 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | JMZ $a,$1 | Le processus sautera sur la case 'a' au lieu de sauter sur la case 1 |
1 | DAT #0,#0 | car les deux arguments de la case 1 sont nuls |
... | ... | - |
a | XXX ... | Le processus exécutera cette instruction au lieu de DAT #0,#0 |
Adresse | Instructions | Commentaire |
---|---|---|
->0 | JMZ $a,$2 | Le processus ne sautera pas sur la case 'a' car |
1 | ... | le premier argument de la case 2 n'est pas nulle |
2 | MOV &1,$0 | Le premier argument n'est pas nul |
... | ... | - |
a | XXX ... | - |
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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | JMG $a,$1 | Le processus sautera sur la case 'a' au lieu de sauter sur la case 1 |
1 | ADD #2,$3 | car les deux arguments de la case 1 sont > 0 |
... | ... | - |
a | XXX ... | Le processus exécutera cette instruction au lieu de ADD #2,$3 |
Adresse | Instructions | Commentaire |
---|---|---|
->0 | JMG $a,$2 | Le processus ne sautera pas sur la case 'a' car le deuxième argument de |
1 | ... | la case 2 n'est pas > 0 |
2 | MOV &1,$-5 | - |
... | ... | - |
a | XXX ... | - |
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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | DJZ $a,$2 | Le 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) |
2 | MOV #1,$1 | Etat de la case avant la modification |
*2* | MOV #0,$0 | Etat de la case après la modification |
... | ... | - |
a | XXX ... | Le processus sautera sur cette case |
Adresse | Instructions | Commentaire |
---|---|---|
->0 | DJZ $a,$2 | Le processus ne sautera pas sur la case 'a' car le deuxième argument de |
1 | ... | la case 2 vaudrat 4. |
2 | MOV #1,$5 | Etat de la case avant la modification |
*2* | MOV #0,$4 | Etat de la case après la modification |
... | ... | - |
a | XXX ... | 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | CMP #5,$5 | Le processus ne sautera pas à la case 2 car les deux arguments de |
1 | ... | la case 3 sont égaux. |
2 | ... | - |
3 | DAT #5,#5 | - |
Adresse | Instructions | Commentaire |
---|---|---|
->0 | CMP #5,$5 | Le processus sautera à la case 2 car les deux arguments de |
1 | ... | la case 3 ne sont sont égaux. |
2 | XXX ... | Le processus sautera sur cette case |
3 | DAT #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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | CMP $4,$3 | Le 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. |
3 | MOV #1,#1 | - |
4 | MOV #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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | FORK $a | Le nouveau processus sera crée sur la case 1 |
1 | XXX ... | le nouveau processus commence ici |
... | ... | - |
a | XXX ... | 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 :
Adresse | Instructions | Commentaire |
---|---|---|
->0 | RND #b,$a | Crée un DAT sur la case a |
... | ... | - |
a | XXX ... | - |
*a* | DAT #c #c | où 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