SAE12_2021/mon_gcc.c
2021-12-17 17:59:37 +01:00

436 lines
6.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
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(;i<taille;i++){
puissance=pow(10, (taille-(i+1)));
if(chaine[i]=='1'){
entier+=1*puissance;
}
if(chaine[i]=='2'){
entier+=2*puissance;
}
if(chaine[i]=='3'){
entier+=3*puissance;
}
if(chaine[i]=='4'){
entier+=4*puissance;
}
if(chaine[i]=='5'){
entier+=5*puissance;
}
if(chaine[i]=='6'){
entier+=6*puissance;
}
if(chaine[i]=='7'){
entier+=7*puissance;
}
if(chaine[i]=='8'){
entier+=8*puissance;
}
if(chaine[i]=='9'){
entier+=9*puissance;
}
}
if(entier>7999){
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;
}