Nous sommes étudiants en gtr et nous avons un projet en c à réaliser.Nous n'y arrivons pas pouvez vous nous aider un petit peu ?
Nous sommes sûrs que pour les grosses bêtes de programmation ça ne devraient pas prendre plus d'une heure
Merci
Emulateur de processeur
------------------------------------------------------------------------
Objectif du sujet
L'objectif de ce projet est de faire un émulateur de processeur qui permette d'effectuer des programmes. Cet émulateur devra servir à exécuter simultannément deux programmes "virus" qui se battront pour le contrôle de la "mémoire".
Le programme doit remplir plusieurs fonctionnalités :
1.il offre une interface à l'utilisateur ;
2.il initialise la "mémoire" ;
3.il charge les fichiers en "mémoire" :
?il lit les programmes dans des fichiers ;
?il code les instructions en "octets" ;
?il les charge dans la "mémoire".
4.il exécute les programmes en "mémoire" :
?il gère les pointeurs d'instructions (il y en aura deux) ;
?il décode les instructions alternativement pour chacun des deux programmes ;
?il exécute ces instructions.
Principes
1. Représentation de la "mémoire"
Pour pouvoir faire un programme qui en gère d'autres en "mémoire", cette dernière sera représentée dans la RAM par un tableau (de grande dimension : 256 cases). Afin de simplifier la programmation des "virus", on gèrera ce tableau de façon circulaire, c'est à dire que la case suivant la case 255 sera la case 0 (il n'y aura donc jamais de débordement de la mémoire).
2. Codage des instructions
Votre programme doit lire les fichiers dans lesquels sont écrits les programmes des "virus", en mnémoniques, et traduire ces mnémoniques en une suite de codes numériques correspondant au jeu d'instruction. Afin de se simplifier l'opération, on va utiliser des instructions qui auront toutes la même taille, opérandes comprises. Les mnémoniques auront la forme suivante :
INS [@/r/#] arg1, [@/r/#] arg2 ;commentaire
?INS est la mnémonique, qui doit comporter 3 lettres. ?Le code 'r' signifie que la donnée est à l'adresse relative qui suit. ?Le code '@' signifie que la donnée est à prendre à l'adresse qui suit. ?Le code '#' signifie que la donnée qui suit est une valeur directe. ?arg1 et arg2 sont des valeurs utilisées par l'instruction (arg2 quelconque si non utilisé).
Tous les champs (hors commentaire) sont obligatoirement remplis pour simplifier l'analyse des fichiers textes.
arg1 et arg2 peuvent désigner des adresses dans la "mémoire" (des indices du tableau) : elles doivent donc pouvoir aller de 0 à 255. Ce seront donc des octets. Les codes [@/r/#] peuvent être codés sur 2 bit. Pour que l'ensemble d'une instruction tienne sur 3 octets, on doit se limiter à 5 bits pour définir le jeu d'instructions, ce qui nous laisse tout de même 32 instructions possibles. Chaque case du tableau mémoire sera alors constituée de trois octets (une sorte de processeur à bus de donnée 24 bits).
On vous propose le jeu d'instruction suivant, que vous pourrez compléter à votre guise :
00000 DAT stoque ces 3 octets à cette case mémoire (cette instruction n'est pas exécutable).
00001 MOV recopie arg2 dans arg1
00010 ADD additionne arg2 à arg1 et le range dans arg1
00011 SUB soustrait arg2 à arg1 et le range dans arg1
00101 JMP saute à arg1
00110 JZE saute à arg1 si arg2 est nul
00111 JGT saute à arg1 si arg2 est supérieur à zéro.
Gestion des programmes en mémoire
Le programme doit ensuite placer les deux programmes au départ (soit de manière arbitraire soit au hasard). Puis il doit activer à tour de rôle les instructions d'un virus et de l'autre (comme si on avait deux registres Instruction Pointer activés alternativement).
Le programme doit évaluer chaque instruction selon le dictionnaire choisi. Une fois décodé le type d'instruction et chargés les deux arguments, il faudra bien faire attention au type d'adressage utilisé (direct #, relatif r et indirect @) qui modifie le fonctionnement de l'instruction. Cette partie est sans doute la plus ardue. Le mode par défaut sera le mode relatif, en particulier lorsque une adresse sera prise indirectement, il faudra ensuite la considérer relative. Par exemple:
JMP @ 001 # 000
DAT # 000 # 010
Dans cet exemple, on récupère la valeur stockée 001 case plus loin (avec DAT), et on saute du nombre de case indiquées (en décimal, 10). Toutes les valeurs sont donc traitées de manière relative à l'adresse courante (pointée par l'"InstructionPointer" ).
Certaines valeurs des paquets de 3 octets ne correspondent à aucune instruction (notamment DAT qui n'est là que pour initialiser des octets, qui pourront servir de variable). Un virus "meurt" lorsque il essaie d'évaluer une de ces suites d'octets qui ne correspond à rien.
Règle du combat de virus
Les virus sont des petits programmes. Dans la mémoire de l'ordinateur, les virus sont des suites d'octets correspondant à des suites d'instructions (voir cours d'architecture des ordinateurs).
Dans votre projet, un virus mourra quand son programme l'amènera à exécuter une instruction illégale. Un virus essaiera de tuer l'autre en modifiant le contenu des cases mémoires qui contiennent le programme de cet autre virus. La difficulté pour le virus est de localiser l'emplacement de l'autre virus (qui est très petit au sein de la mémoire et qui de plus peut bouger).
Exemples
Voici quelques virus pour tester votre programme :
Le rouleau compresseur
MOV r 000 r 001 ;Remplit la mémoire de lui-même
Interface pour l'utilisateur
Le programme doit simplement permettre de suivre l'évolution du combat en affichant certaines données comme les valeurs des deux "InstructionPointers", ou les instructions correspondant à ces adresses.