436 lines
6.7 KiB
C
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;
|
|
} |