#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; }