From 87415d647560f9d64677237922fbd2323ab67025 Mon Sep 17 00:00:00 2001 From: martins Date: Fri, 17 Dec 2021 17:59:37 +0100 Subject: [PATCH] ajout des fichier dans le bon git --- Makefile | 46 +++++ README.md | 21 ++- ReadMe.md | 14 ++ Virus1.ass | 1 + Virus2.ass | 4 + action.c | 156 ++++++++++++++++ decod_instruction.c | 266 +++++++++++++++++++++++++++ decod_instruction.h | 12 ++ graphique.c | 79 ++++++++ graphique.h | 11 ++ mon_gcc | Bin 0 -> 26952 bytes mon_gcc.c | 436 ++++++++++++++++++++++++++++++++++++++++++++ superviseur | Bin 0 -> 21824 bytes vir1.mars | 1 + vir2.mars | 4 + 15 files changed, 1050 insertions(+), 1 deletion(-) create mode 100644 Makefile create mode 100644 ReadMe.md create mode 100644 Virus1.ass create mode 100644 Virus2.ass create mode 100644 action.c create mode 100644 decod_instruction.c create mode 100644 decod_instruction.h create mode 100644 graphique.c create mode 100644 graphique.h create mode 100755 mon_gcc create mode 100644 mon_gcc.c create mode 100755 superviseur create mode 100644 vir1.mars create mode 100644 vir2.mars diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5e8f484 --- /dev/null +++ b/Makefile @@ -0,0 +1,46 @@ +but : superviseur + +OFILES= action.o\ + decod_instruction.o\ + graphique.o + +CFLAGS= -Wall -ansi -pedantic -g -lgraph -o + + + + +action.o : action.c + gcc action.c -c -lgraph -o action.o + +decod_instruction.o : decod_instruction.h decod_instruction.c graphique.h + gcc decod_instruction.c -c -o decod_instruction.o + +graphique.o : graphique.h graphique.c + gcc graphique.c -c -lgraph -o graphique.o + + + +superviseur : $(OFILES) + gcc $(OFILES) $(CFLAGS) superviseur + + +clean : + -rm -f $(OFILES) taquin + +run : + ./superviseur +compil : + gcc mon_gcc.c -Wall -ansi -g -lm -o mon_gcc + +execute : + ./mon_gcc Virus1.ass Virus2.ass + +#chapitre 6 : buts factices + +.PHONY : but clean + +.PHONY : but run + +.PHONY : but compil + +.PHONY : but execute diff --git a/README.md b/README.md index 9eb4cce..fbdf992 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,22 @@ # SAE12_2021 -Core War \ No newline at end of file +Core War + +Etat du Projet: +Le projet a été entierrement réaliser normalement avec: un traducteur du language d'assembleur appeler mon_gcc a qui nous fournissons 2 fichier contenant les instructions des virus, ainsi que un superviseur lisant ces fichiers, les placant dans une case memoire d'un tableau a minimun 1000 case de distance, executant les instruction a tour de role des virus et declanrant perdant le virus qui retourne une erreur. Si au bout de 7500 execution d'instruction aucun virus n'a perdu alors l'égalité est declarer. Une interface graphique pour mieux visualiser l'evolution des virus avec en bleu le virus n°1, en vert le virus n°2 et en rouge les case du tableau qui sont modifiée par les virus. + +Participant: +Tom Monin +Clément Martins + +Difficulté: +Nous avons eu des difficultés lors de l'étape pour convertir les instruction en indication et les executer. Nous esperons que toute les actions marche normallement même si normalement, nous avons fait des test et cela est bon. + +Temps: +Nous aurions aimée pouvoir faire des statistique sur un nombre choisit d'execution avec le nombre de victoire de chaque virus ainsi que celui d'egalité pour facilité la création du meilleur virus. + +Makefile: +pour compiler mon_gcc: make compil +pour l'execter avec les 2 fichier.ass des virus: make execute +pour compiler le superviseur: make +pour executer le superviseur avec l'interface graphique: make run \ No newline at end of file diff --git a/ReadMe.md b/ReadMe.md new file mode 100644 index 0000000..a6f39b0 --- /dev/null +++ b/ReadMe.md @@ -0,0 +1,14 @@ +SAE1.2 + +Etat du Projet: +Le projet a été entierrement réaliser normalement avec: un traducteur du language d'assembleur appeler mon_gcc a qui nous fournissons 2 fichier contenant les instructions des virus, ainsi que un superviseur lisant ces fichiers, les placant dans une case memoire d'un tableau a minimun 1000 case de distance, executant les instruction a tour de role des virus et declanrant perdant le virus qui retourne une erreur. Si au bout de 7500 execution d'instruction aucun virus n'a perdu alors l'égalité est declarer. Une interface graphique pour mieux visualiser l'evolution des virus avec en bleu le virus n°1, en vert le virus n°2 et en rouge les case du tableau qui sont modifiée par les virus. + +Participant: +Tom Monin +Clément Martins + +Difficulté: +Nous avons eu des difficultés lors de l'étape pour convertir les instruction en indication et les executer. Nous esperons que toute les actions marche normallement même si normalement, nous avons fait des test et cela est bon. + +Temps: +Nous aurions aimée pouvoir faire des statistique sur un nombre choisit d'execution avec le nombre de victoire de chaque virus ainsi que celui d'egalité pour facilité la création du meilleur virus. \ No newline at end of file diff --git a/Virus1.ass b/Virus1.ass new file mode 100644 index 0000000..beec7df --- /dev/null +++ b/Virus1.ass @@ -0,0 +1 @@ +DAT -1 \ No newline at end of file diff --git a/Virus2.ass b/Virus2.ass new file mode 100644 index 0000000..99fca94 --- /dev/null +++ b/Virus2.ass @@ -0,0 +1,4 @@ +DAT -1 +ADD #5 -1 +MOV #0 @-2 +JMP -2 \ No newline at end of file diff --git a/action.c b/action.c new file mode 100644 index 0000000..6703c3c --- /dev/null +++ b/action.c @@ -0,0 +1,156 @@ +#include +#include +#include +#include +#include +#include +#include "decod_instruction.h" +#include "graphique.h" + + +int main(void){ + InitialiserGraphique(); + FILE* virus; + virus=fopen("./vir1.mars", "r"); + srand(time(NULL)); + CreerFenetre(0, 0, 1600, 900); + PremiereImage(); + /* + Ouverture des fichiers contenant les entiers des instruction. + */ + int adresse_aleatoire; + adresse_aleatoire=rand()%8000; + + unsigned long int tableau[8000]; + + /* + Le tableau de 8000 cases represente la memoire. + */ + + int retenue1=adresse_aleatoire; + int verif=feof(virus); + int tableau_binaire[64]; + + + while(verif!=1){ + + unsigned long int valeur_instruction; + fscanf(virus, "%lu", &valeur_instruction); + tableau[adresse_aleatoire]=valeur_instruction; + adresse_aleatoire++; + if(adresse_aleatoire==8000){ + adresse_aleatoire=0; + } + verif=feof(virus); + } + fclose(virus); + /* + Fonction permettant de savoir si on est sur une fin de fichier. + */ + + virus=fopen("./vir2.mars", "r"); + /* + lecture entier stocker. + */ + for(;adresse_aleatoire!=retenue1; adresse_aleatoire--){ + if(adresse_aleatoire==-1){ + adresse_aleatoire=7999; + } + } + + do{ + adresse_aleatoire=rand()%8000; + }while((((adresse_aleatoire-1000)<=retenue1)&&(retenue1<=adresse_aleatoire))||((adresse_aleatoire<=retenue1)&&(retenue1<=(adresse_aleatoire+1000)))); + int retenue2=adresse_aleatoire; + verif=feof(virus); + while(verif!=1){ + /* + Positionne les virus aléatoirement dans la mémoire de 8000 cases. + */ + unsigned long int valeur_instruction; + fscanf(virus, "%lu", &valeur_instruction); + tableau[adresse_aleatoire]=valeur_instruction; + adresse_aleatoire++; + if(adresse_aleatoire==8000){ + adresse_aleatoire=0; + } + verif=feof(virus); + } + virus=fopen("./vir2.mars", "r"); + for(;adresse_aleatoire!=retenue1; adresse_aleatoire--){ + if(adresse_aleatoire==-1){ + adresse_aleatoire=7999; + } + } + clock_t retenue_temps; + retenue_temps=clock(); + clock_t temps; + temps=clock(); + temps=difftime(temps, retenue_temps)/1000000; + int nb_virus=1; + int nombre_execution=0; + int init_1=retenue1; + int init_2=retenue2; + +while(nombre_execution<7500){ + int perdant=0; + if(temps>5){ + + + /* toute les 0,2 seconde pour pouvoir mieux suivre l'affichage a l'ecran */ + + if(nb_virus==1){ + if(retenue1==8000){ + retenue1=0; + } + DessinerVirus(retenue1, "blue"); + convertion(tableau_binaire, tableau[retenue1]); + /*decodeur_instruction(tableau, retenue1);*/ + nb_virus=2; + nombre_execution++; + perdant=decodeur_instruction(tableau_binaire, tableau, &retenue1); + if(perdant!=0){ + printf("\n\033[34m virus 1 a perdu \033[0m\n"); + ImageFin(nb_virus); + return EXIT_SUCCESS; + } + } + else{ + if(retenue2==8000){ + retenue2=0; + } + DessinerVirus(retenue2, "green"); + convertion(tableau_binaire, tableau[retenue2]); + /*decodeur_instruction(tableau, retenue2);*/ + nb_virus=1; + nombre_execution++; + perdant=decodeur_instruction(tableau_binaire, tableau, &retenue2); + if(perdant!=0){ + printf("\n\033[32m virus 2 a perdu \033[0m\n"); + ImageFin(nb_virus); + return EXIT_SUCCESS; + } + } + + + retenue_temps=clock(); + temps=clock(); + temps=difftime(temps, retenue_temps)/1000; + } + temps=clock(); + temps=difftime(temps, retenue_temps)/1000; + +} +/* + On fais switch exécution pour qu'elle s'exécute à tour de rôle et on a mis un temps entre chaque execution pour pouvoir mieux suivre l'évolution des + virus. si il ne se passe rien avant un nombre maximal d'instruction. + on marque que les virus sont à égalité. +*/ + +printf("\033[32m \n egalité aucun virus n'a gagner \033[0m \n"); + +fclose(virus); + +return EXIT_SUCCESS; + +} diff --git a/decod_instruction.c b/decod_instruction.c new file mode 100644 index 0000000..a539c76 --- /dev/null +++ b/decod_instruction.c @@ -0,0 +1,266 @@ +#ifndef DECOD_C +#define DECOD_C + +#include +#include +#include +#include +#include "graphique.h" + +void convertion(int* binraire, unsigned long int valeur){ + int i=0; + int max=63; + unsigned long int verif; + for(i=0;i<64;i++){ + max=63-i; + verif=1; + for(;max>=1;max--){ + verif=verif*2; + } + if(verif<=valeur){ + valeur-=verif; + binraire[i]=1; + }else{ + binraire[i]=0; + } + } +} + + +unsigned long int transtypage(int tab_binaire[], int nb){ + int i; + + int j; + unsigned long int entier = 0; + unsigned long int pow = 0; +if(nb==1){ + for(i=8;i<36;i++){ + } + for(i = 8; i < 36; i++){ + if(tab_binaire[i] == 1){ + pow =1; + for(j = 0; j < 27+8-i ; j++ ){ + pow = pow * 2; + } + entier += pow; + } + } +} +if(nb==2){ + for(i=36;i<64;i++){ + } +for(i = 36; i < 64; i++){ + if(tab_binaire[i] == 1){ + pow =1; + for(j = 0; j < 27+36-i ; j++ ){ + pow = pow * 2; + } + entier += pow; + } + } +} +return entier; +} + + +int decodeur_instruction( int tab[], unsigned long int memoire[], int* adresse){ + int bin[4]; + int adresse1; + int adresse2=12; + int i; + int resultat = 0; + int allocation1=0; + int allocation2=0; + + for(i = 0; i < 4; i++) + { + bin[i]= tab[i]; + } + + if(tab[4]==0 && tab[5]==1){ + allocation1=1; + } + if(tab[4]==1 && tab[5]==0){ + allocation1=2; + } + if(tab[4]==1 && tab[5]==1){ + allocation1=3; + } + + if(tab[6]==0 && tab[7]==1){ + allocation2=1; + } + if(tab[6]==1 && tab[7]==0){ + allocation2=2; + } + if(tab[6]==1 && tab[7]==1){ + allocation2=3; + } + + + adresse1=transtypage(tab, 1); + adresse2=transtypage(tab, 2); + + if(allocation1==3){ + resultat++; + } + if(allocation1==1){ + adresse1=*adresse+adresse1; + } + if(allocation1==2){ + adresse1=*adresse+adresse1; + if(adresse1>7999){ + adresse1=adresse1%8000; + } + if(adresse2>7999){ + adresse2=adresse2%8000; + } + unsigned long int valeur=memoire[adresse1]; + adresse1=*adresse+valeur; + } + if(allocation2==3){ + resultat++; + } + if(allocation2==1){ + adresse2=*adresse+adresse2; + } + + if(allocation2==2){ + adresse2=*adresse+adresse2; + if(adresse1>7999){ + adresse1=adresse1%8000; + } + if(adresse2>7999){ + adresse2=adresse2%8000; + } + unsigned long int valeur=memoire[adresse2]; + adresse2=*adresse+valeur; + } + + if(adresse1>7999){ + adresse1=adresse1%8000; + } + if(adresse2>7999){ + adresse2=adresse2%8000; + } + + if(bin[0] == 0 && bin[1] == 0 && bin[2] == 0 && bin[3] == 0) /* DAT */ + { + if(adresse2==0){ + return -1; + }else{ + *adresse=*adresse+1; + resultat--; + } + } + + if(bin[0] == 0 && bin[1] == 0 && bin[2] == 0 && bin[3] == 1) /* 1 MOV */ + { + if(allocation1!=0){ + memoire[adresse2]=memoire[adresse1]; + }else{ + memoire[adresse2]=adresse1; + } + *adresse=*adresse+1; + resultat--; + DessinerVirus(adresse2, "red"); + } + + if(bin[0] == 0 && bin[1] == 0 && bin[2] == 1 && bin[3] == 0) /* 2 ADD */ + { + + if(allocation1!=0){ + memoire[adresse2]=memoire[adresse1]+memoire[adresse2]; + }else{ + memoire[adresse2]+=adresse1; + } + *adresse=*adresse+1; + resultat--; + DessinerVirus(adresse2, "red"); + } + + if(bin[0] == 0 && bin[1] == 0 && bin[2] == 1 && bin[3] == 1) /* 3 SUB */ + { + unsigned long int retenue; + if(allocation1!=0){ + retenue=memoire[adresse1]-memoire[adresse2]; + }else{ + retenue=adresse1-memoire[adresse2]; + } + if(retenue<0){ + retenue+=8000; + } + memoire[adresse1]=retenue; + + *adresse=*adresse+1; + resultat--; + DessinerVirus(adresse1, "red"); + } + + if(bin[0] == 0 && bin[1] == 1 && bin[2] == 0 && bin[3] == 0) /* 4 JMP */ + { + *adresse=adresse1; + resultat--; + } + + if(bin[0] == 0 && bin[1] == 1 && bin[2] == 0 && bin[3] == 1) /* 5 JMZ */ + { + if(memoire[adresse2]==0){ + *adresse=adresse1; + }else{ + *adresse=*adresse+1; + } + resultat--; + } + + if(bin[0] == 0 && bin[1] == 1 && bin[2] == 1 && bin[3] == 0) /* 6 JMG */ + { + if(memoire[adresse2]>0){ + *adresse=adresse1; + }else{ + *adresse=*adresse+1; + resultat--; + } + } + + if(bin[0] == 0 && bin[1] == 1 && bin[2] == 1 && bin[3] == 1) /* 7 DJZ */ + { + if(allocation2!=0){ + memoire[adresse2]=memoire[adresse2]-1; + if(memoire[adresse2]==0){ + *adresse=adresse1; + } + }else{ + adresse2=adresse2-1; + if(adresse2==0){ + *adresse=adresse1; + } + } + DessinerVirus(adresse2, "red"); + resultat--; + } + + if(bin[0] == 1 && bin[1] == 0 && bin[2] == 0 && bin[3] == 0) /* 8 CMP */ + { + if(allocation1!=0){ + if(memoire[adresse2]==memoire[adresse1]){ + *adresse=*adresse+1; + }else{ + *adresse=*adresse+2; + } +}else{ + if(memoire[adresse2]==adresse1){ + *adresse=*adresse+1; + }else{ + *adresse=*adresse+2; + } +} + resultat--; + } + resultat++; + return resultat; + + +} + +#endif \ No newline at end of file diff --git a/decod_instruction.h b/decod_instruction.h new file mode 100644 index 0000000..6c1871d --- /dev/null +++ b/decod_instruction.h @@ -0,0 +1,12 @@ +#ifndef DECOD_INSTRUCTION_h +#define DECOD_INSTRUCTION_H + +void convertion(int* binraire, unsigned long int valeur); + +unsigned long int transtypage(int tab_binaire[], int nb); +int decodeur_instruction( int tab[], unsigned long int memoire[], int* adresse); + + + + +#endif \ No newline at end of file diff --git a/graphique.c b/graphique.c new file mode 100644 index 0000000..8b92029 --- /dev/null +++ b/graphique.c @@ -0,0 +1,79 @@ +#ifndef GRAPHIQUE_C +#define GRAPHIQUE_C +#include +#include +#include +#include +#include +#include + +void DessinerVirus(unsigned long int addresse, char* coul){ + couleur t; + + t=CouleurParNom(coul); + ChoisirCouleurDessin(t); + + int i; + int j; + int x; + int y; + + for(i=0;i<16;i++){ + for(j=0;j<501;j++){ + addresse=addresse-1; + if(addresse==0){ + x=35+j*3; + y=20+i*55; + break; + } + } + if(addresse==0){ + break; + + } + } + DessinerRectangle(x, y, 3, 30); +} + +void PremiereImage(void){ + int x=3; + int y=45+10; + int i; + int lx=3; + int ly=30; + int j; + + for(i=0;i<16;i++){ + + for(j=0;j<501;j++){ + + DessinerRectangle(35+j*(x), 20+i*(y), lx, ly); + + + } + } +} + +void ImageFin(int nb_image){ + couleur c; + c=CouleurParNom("red"); + ChoisirCouleurDessin(c); + EcrireTexte(700, 400, "Fin de la Partie", 2); + Touche(); + if(nb_image==1){ + c=CouleurParNom("blue"); + EffacerEcran(c); + c=CouleurParNom("white"); + ChoisirCouleurDessin(c); + EcrireTexte(650, 400, "Le virus numero 1 a gagner", 2); + } + if(nb_image==2){ + c=CouleurParNom("green"); + EffacerEcran(c); + c=CouleurParNom("white"); + ChoisirCouleurDessin(c); + EcrireTexte(650, 400, "Le virus numero 2 a gagner", 2); + } + Touche(); +} +#endif \ No newline at end of file diff --git a/graphique.h b/graphique.h new file mode 100644 index 0000000..bff32a5 --- /dev/null +++ b/graphique.h @@ -0,0 +1,11 @@ +#ifndef GRAPHIQUE_H +#define GRAPHIQUE_H + +void DessinerVirus(unsigned long int addresse, char* coul); + +void PremiereImage(void); + +void ImageFin(int nb_image); + + +#endif \ No newline at end of file diff --git a/mon_gcc b/mon_gcc new file mode 100755 index 0000000000000000000000000000000000000000..fc8729053bafe514e5fc0294cf153cd9c76a2cc6 GIT binary patch literal 26952 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 literal 0 HcmV?d00001 diff --git a/mon_gcc.c b/mon_gcc.c new file mode 100644 index 0000000..2c6a1d9 --- /dev/null +++ b/mon_gcc.c @@ -0,0 +1,436 @@ +#include +#include +#include +#include + +int entier_ecrit(char* chaine, int taille, int valeur[]){ +int i=0; +int entier=0; +int negatif=0; +if(chaine[0]=='-'){ + negatif=1; + i=1; +} +int puissance=0; +for(;i7999){ + entier=entier%8000; +} +if(negatif==1){ + entier=8000+(entier*-1); +} +return entier; +} + +void convertion_binaire(int valeur[], int nombre, int type){ + + if(type==0){ + int compteur=8; + for(;compteur<36; compteur++){ + int puissance=36-compteur-1; + if((pow(2, puissance))<=nombre){ + valeur[compteur]=1; + nombre=nombre-pow(2, puissance); + }else{ + valeur[compteur]=0; + } + } + } + if(type==2){ + int compteur=36; + for(;compteur<64; compteur++){ + int puissance=64-compteur-1; + if((pow(2, puissance))<=nombre){ + valeur[compteur]=1; + nombre=nombre-pow(2, puissance); + }else{ + valeur[compteur]=0; + } + } + } + if(type==3){ + int compteur=8; + for(;compteur<36;compteur++){ + valeur[compteur]=0; + } + + for(;compteur<64; compteur++){ + int puissance=64-compteur-1; + if((pow(2, puissance))<=nombre){ + valeur[compteur]=1; + nombre=nombre-pow(2, puissance); + }else{ + valeur[compteur]=0; + } + } + } + if(type==1){ + int compteur=36; + for(;compteur<64;compteur++){ + valeur[compteur]=0; + } + compteur=8; + for(;compteur<36; compteur++){ + int puissance=36-compteur-1; + if((pow(2, puissance))<=nombre){ + valeur[compteur]=1; + nombre=nombre-pow(2, puissance); + }else{ + valeur[compteur]=0; + } + } + } +} +/* + Permet la conversion en binaire des entier rentre. +*/ + + + +void code(char* chaine, int valeur[]){ + +/* on recupère les 3 premiers caratères pour les retranscrire en bits */ +char instruction[4]; +int i; +for(i=0; i<3; i++){ +instruction[i]=chaine[i]; +} +instruction[3]='\0'; +int verif; + + + +/* on convertie cette chaine en l'entier correspondant */ +char MOV[4]="MOV\0"; +char ADD[4]="ADD\0"; +char SUB[4]="SUB\0"; +char JMP[4]="JMP\0"; +char JMZ[4]="JMZ\0"; +char JMG[4]="JMG\0"; +char DJZ[4]="DJZ\0"; +char CMP[4]="CMP\0"; +char DAT[4]="DAT\0"; +char indirect[2]="@\0"; +char immediat[2]="#\0"; +int nb_adresse=0; + +verif=strcmp(instruction, MOV); +if(verif==0){ +valeur[0]=0; +valeur[1]=0; +valeur[2]=0; +valeur[3]=1; +nb_adresse=2; +} + +verif=strcmp(instruction, ADD); +if(verif==0){ +valeur[0]=0; +valeur[1]=0; +valeur[2]=1; +valeur[3]=0; +nb_adresse=2; +} + +verif=strcmp(instruction, SUB); +if(verif==0){ +valeur[0]=0; +valeur[1]=0; +valeur[2]=1; +valeur[3]=1; +nb_adresse=2; +} + +verif=strcmp(instruction, JMP); +if(verif==0){ +valeur[0]=0; +valeur[1]=1; +valeur[2]=0; +valeur[3]=0; +nb_adresse=1; +} + +verif=strcmp(instruction, JMZ); +if(verif==0){ +valeur[0]=0; +valeur[1]=1; +valeur[2]=0; +valeur[3]=1; +nb_adresse=2; +} + +verif=strcmp(instruction, JMG); +if(verif==0){ +valeur[0]=0; +valeur[1]=1; +valeur[2]=1; +valeur[3]=0; +nb_adresse=2; +} + +verif=strcmp(instruction, DJZ); +if(verif==0){ +valeur[0]=0; +valeur[1]=1; +valeur[2]=1; +valeur[3]=1; +nb_adresse=2; +} + +verif=strcmp(instruction, CMP); +if(verif==0){ +valeur[0]=1; +valeur[1]=0; +valeur[2]=0; +valeur[3]=0; +nb_adresse=2; +} + +verif=strcmp(instruction, DAT); +if(verif==0){ +valeur[0]=0; +valeur[1]=0; +valeur[2]=0; +valeur[3]=0; +nb_adresse=3; +} + +char adressage[2]; +adressage[0]=chaine[4]; +adressage[1]='\0'; +i=-1; + +verif=strcmp(adressage, immediat); +if(verif==0){ + valeur[4]=0; + valeur[5]=0; + i=0; +} + +verif=strcmp(adressage, indirect); +if(verif==0){ + valeur[4]=1; + valeur[5]=0; + i=0; +} +if(i==-1){ + valeur[4]=0; + valeur[5]=1; + +} + +if(nb_adresse==3){ + valeur[6]=valeur[4]; + valeur[7]=valeur[5]; + valeur[4]=0; + valeur[5]=0; +} +if(nb_adresse==1){ + valeur[6]=0; + valeur[7]=0; +} + +char adresse1[6]; +int compteur=5; +int nombre1; + + +if(nb_adresse==2){ +int a=0; + while(chaine[compteur+i]!=' '){ + adresse1[a]=chaine[compteur+i]; + i++; + a++; +} +compteur+=i+2; +adresse1[a]='\0'; +nombre1=entier_ecrit(adresse1, a, valeur); +convertion_binaire(valeur, nombre1, 0); + + + + +adressage[0]=chaine[compteur-1]; +adressage[1]='\0'; +i=-1; +verif=strcmp(adressage, immediat); +if(verif==0){ + valeur[6]=0; + valeur[7]=0; + i=0; +} + +verif=strcmp(adressage, indirect); +if(verif==0){ + valeur[6]=1; + valeur[7]=0; + i=0; +} +if(i==-1){ + valeur[6]=0; + valeur[7]=1; + +} + + a=0; + while((chaine[compteur+i]!='\000')&&(chaine[compteur+i]!='\n')){ + adresse1[a]=chaine[compteur+i]; + i++; + a++; +} + +adresse1[a]='\0'; +nombre1=entier_ecrit(adresse1, a, valeur); +convertion_binaire(valeur, nombre1, 2); +} + + + +if(nb_adresse!=2){ + int a=0; + while((chaine[compteur+i]!='\000')&&(chaine[compteur+i]!='\n')){ + adresse1[a]=chaine[compteur+i]; + i++; + a++; +} +adresse1[a]='\0'; +nombre1=entier_ecrit(adresse1, a, valeur); +if(nb_adresse==3){ + valeur[6]=0; + valeur[7]=0; + } + convertion_binaire(valeur, nombre1, nb_adresse); + +} +if(nb_adresse==0){ +printf(" \n \033[31m erreur script des Virus éronné \033[0m \n"); +} + +} + +unsigned long int transtypage(int tab_binaire[]) +{ + int i; + int j; + int bin; + unsigned long int entier = 0; + unsigned long int pow = 0; + +/* + Boucle qui sert a changer le nombre binaire donner a l'aide d'un tableau en decimal. +*/ + for(i = 0; i < 64; i++) + { + bin = tab_binaire[i]; + if(bin == 1) + { + /* + cette deuxieme boucle simule une puissance. + */ + pow =1; + for(j = 0; j < 63-i ; j++ ) + { + pow = pow * 2; + } + entier = entier + pow; + } + + } + + return entier; + +} + + +void code_entier(char* instruction, unsigned long int* entier){ +int v[64]; +code(instruction, v); + *entier=transtypage(v); + +} + +int main(int argc, char* argv[]){ + + if(argc<3){ + printf("\033[31m erreur, execution attendue:\" ./mongcc [Virus1.ass] [Virus2.ass] \" \033[0m \n "); + return EXIT_SUCCESS; + } + /* + Permet de tester le nombre d'argument. + */ + char instruction[20]; + FILE* virus1; + FILE* final1; + final1=fopen("./vir1.mars", "w"); + /* + Ouverture et ecriture des entier dans un fichier. + */ + unsigned long int entier=0UL; + virus1=fopen(argv[1], "r"); + int verif=feof(virus1); + do{ + + fgets(instruction, 20, virus1); + code_entier(instruction, &entier); + verif=feof(virus1); + fprintf(final1, "%lu", entier); + if(verif!=1){ + fprintf(final1, "\n"); + + } + +}while(verif!=1); +fclose(virus1); +fclose(final1); +final1=fopen("./vir2.mars", "w"); + /* + Ouverture et ecriture des entier dans un fichier. + */ +virus1=fopen(argv[2], "r"); +do{ + + fgets(instruction, 20, virus1); + code_entier(instruction, &entier); + verif=feof(virus1); + fprintf(final1, "%lu", entier); + if(verif!=1){ + fprintf(final1, "\n"); + + } + +}while(verif!=1); +fclose(virus1); + +return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/superviseur b/superviseur new file mode 100755 index 0000000000000000000000000000000000000000..66d8ecce36968513f1cac3c7fe0109bee45db469 GIT binary patch literal 21824 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