J´ai corrigé l´exemple de la page d´explication
Sinon concernant ton code, première chose :
- le CPU commence par exécuter l´instruction courante puis incrémente le pointeur d´instruction et enfin passe à l´exécution des autres processus, autrement dit, juste après avoir exécuté l´instruction, le processus se déplace sur la case d´après où il est réaffiché : c´est ce qui explique qu´on aie le sentiment que c´est le " add" qui plante, alors qu´il s´agit en réalité de l´instruction précédente : le move *5 *4.
Bon c´est peut être pas très clair de cette manière, peut être que je changerai le système d´affichage pour un truc ou l´indice du processus est sur la case courant lors de l´exécution des autres processus
Sinon concernant le problème, il semblerait que cela vienne d´une erreur de logique de ton code :
En utilisant le debuggueur de visual studio, la ligne incriminée :
move *5 *4
est interprétée comme :
un move de la case d´addresse absolue 16 sur la case d´addresse absolue 8 ( autrement dit elle même), si ton programme est chargé à l´addresse 0.
Etant donné que tu utilise un argument1 en mode d´addressage, CodeWar recopie arg1 sur arg2, autrement dit une case à valeur non définie ( d´où ce bloc vide).
J´ai fait plusieurs essais avec différentes addresse de spawn et le problème est à chaque fois celui-ci visiblement... je vais quand même rejetter un oeil...
Et concernant le retour à la ligne, c´est vraiment bête ce truc
, je pensais pas qu´il les gérait comme ca...
Enfin je vais le corriger et sortir une nouvelle version d´ici quelques minutes.
En tout cas merci pour les tests ![]()
Pourtant c´est bizarre en traitant un exemple à la main j´ai pas l´impression qu´il y aie d´erreur...
Je vais regarder de plus près cette histoire...
Si visiblement y a un truc sur le code, voila l´état de la mémoire que je trouve juste avant l´exécution du move *5 *4 :
1985 / / saut:
rand #2000 -1 / / L´adresse où l´on va se répliquer
move #-11 10 / Move #Nb_Ins data
bez *-3 9 / label: bez saut data
move 8 9 / move data ( data+1)
add #11 8 / add #Nb_Ins ( data+1)
move 7 8 / move ( data+1) ( data+2)
add -7 6 / add ( saut) ( data+1)
sub #-8 6 / sub ( #Nb_Ins-3) ( data+2)
move *5 *4 / move *(data+2) *(data+1)
add #1 2 / add #1 data
jump -8 / jump label
-11 / data:
1974 / data+1:
-19 / data+2:
data2 semblez avoir une valeur de -19 pour addresse relative...
Enfin je veux dire data1 semble avoir une addresse bizarre sachant qu´il sert de source...
Excellent le jeu
dnob700 > Ca y est j´ai supprimé le word wrap.
le_rider-killer > Désolé de ne pas t´avoir répondu avant, mais je me suis rué sur la correction des problèmes signalés
Déjà il est vrai que CodeWar n´est pas un jeu très facile à aborder pour quelqu´un qu´i n´a pas de bases en programmation. C´est de l´assembleur, et je trouve que ma page n´est pas très claire : il faut dire que le public visé n´est pas spécialement le débutant
.
Néanmoins si tu veux te pencher sur le jeu, voici quelques conseils : commence déjà, si tu as télécharger le programme, par faire un copier collé des exemples que j´ai fourni : ca te permettra de voir comment ca fonctionne en gros.
Tu vas dans le menu " file", tu choisi " load" et tu copie/colle un code d´exemple ( commence par le plus simple : move 0 1) dans la partie " code" entre une addresse numérique si tu le désires et appuies sur " load" : tu verra ton code apparaitre sous forme de blocs de couleur à l´écran ( un par ligne de code), ainsi qu´un petit numéro sur le premier bloc.
Ce petit numéro s´appelle un processus : il sert de point de repère pour le jeu pour savoir quelle instruction du programme il doit exécuter.
A chauqe fois qu´il " exécute" une instruction, le jeu déplace le processus sur la case suivante, et ca recommence.
Si tu insère le code des exemples et que tu lances le jeu avec l´option " Run" du menu CPU, tu verras que le processus se déplace sur les blocs de couleurs, symbolisant le fait qu´il parcourt ton programme.
Maintenant que tu as une petite idée de la manière dont le jeu se déroule, familliarise toi avec le langage en prenant les codes d´exmples et en cherchant le rôle de chacune des instructions grâce à la doc : quand tu vois un move, regarde le paragraphe correspondant pour savoir de quoi il s´agit, etc...
La seule petit subtilité concerne l´addressage, c´est à dire à quoi ressemble l´argument.
- Si c´est un nombre avec un # devant, ca veut dire que c´est une valeur directe : elle sera utilisée telle quelle par l´instruction. Par exemple un add #137 . .. ajoutera la valeur 137 à . ..
- Si c´est un nombre sans rien devant, alors c´est un addresse relative : ca veut dire que cela représente une case de la mémoir, partant du principe que la case sur laquelle se trouve le processus au momnent de l´exécution vaut 0 : la case juste après vaut 1, celle encore après vaut 2, celle justa avant vaut -1, etc...
Par exemple, add 10 . .. ajoutera la valeur contenue 10 cases plus loin à . .., jump 10 enverra ton processus 10 cases plus loin, etc...
- Enfin si c´est un nombre précédé de *, il s´agit d´un pointeur : c´est un concept qui peut paraitre un peu compliqué.
Un petit exemple est plus clair :
move #9999 *1
data #137
est équivalent à :
move #9999 137
De même :
data #1234
jump *-1
est équivalent à :
jump 1234
En fait, tu utilise le contenu d´un bloc come addresse relative, c´est tout ![]()
C´est quoi l´intérêt ?
Si tu écrit " jump 1234", ton processus sautera toujours 1234 cases plus loin, tandis que si tu utilises :
data #1234
jump *-1
Tu pourra modifier la valeur 1234, car il s´agit d´un bloc de donnée ( data) : ca permet par exemple, dans l´exmple 2, de créer un bloc data aléatoirement
N´hésites pas à poser une question sur un sujet précis si tu veux plus d´explication sur ce thème ![]()
Merci gollumkawder ![]()
Au fait dnob, ton programme se répliquant aléatoirement sera bien plus intéressant quand j´aurai implémenté la fonction permettant de spawner de nouveaux processus ![]()
par contre enleve le E de move, j´arrive pas a m´y faire :´( ( et pourtant c´est pas l´asm qui m´étouffe lol)
Oui mais moi je préfère l´A68K ![]()
IA-32 powaa..
Je lis et relis la doc pour bien comprendre, et j´ai vu une phrase pas claire
" Néanmoins ce programme demeure inoffensif puisqu´il ne cherche pas à écrire d´instruction illégale data sur le chemin d´autres processus"
´d´instruction illégale data´
T´as oublié un mot ou c´est moi qui fait le wannabe ?
Illégale dans le sens " qui ne doit pas être exécutée sous peine de faire planter l´instance du programme", mais elle est parfaitement acceptée par le jeu.
non je parle de la partie ´illégale data´ dans ´instructions illégale data´ ça sonne bizard 0o´
Je trouve pas ca choquant, mais je peux modifier ![]()
question: la source quand elle sera dispo tu la mettras sous license ? Est-ce qu´on aura le droit de faire un portage IA-32 ? ( Gnu GPL ? )
Chaipa encore pour la licence : un truc libre style GPL, mais j´y connait rien ( et pour ce que ca m´intéresse, je préfère programmer
)
Sinon des portages x86, RedCode seront parfaitement envisageable ![]()
( bon ceci dit il faut pas s´attendre à un truc myrifique : ca a été programmé from scratch sur des créneaux horaires 22h-minuits en semaines de cours, donc même si j´ai fait un peu attention, ce n´est pas forcément un modèle d´implémentation objet
)
merci beaucoup je vais essayer de tout comprendre et meme apprendre vite fait( tres vite fait)l´assembleur si sa peut m´aider en tout acs je commence a mieu comprendre.
Surtout tinquiete pas je me génerais pas pour poser des questions lol!!
encore merci ^^
Je signale quand même que CodeWar est un jeu : tu ne peux pas créer d´applications ou de jeux avec ( quoiqu´en fait on peut créer des trucs genre pacman etc
) , donc ne te lance pas dedans si ton objectif est d´apprendre un langage reconnu pour développer de vraies application : ca c´est juste pour le fun.
Par contre si tu veux t´amuser au corewar, ou avoir une petite idée très simplifiée du fonctionnement de l´assembleur ( vraiment hyper simplifié car il n´y a pas de registres, flags... ) vazy ![]()
Sinon concernant ton code dnob, l´exemple que j´ai traité à la main est faux il me semble, mais il s´agit apparement bien d´un problème d´addresse, cf. ce que j´ai cité avant avec le debugger de visual c++...
Ce qui m´embête c´est que j´ai beau vérifier la logique de mon code, je ne vois pas ce qui peut clocher.