Saturday, May 19, 2012

Assembler (System Programming)


// Program  : Assembler


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 50
struct symtab
{
char name[20];
int addr,len,value,used,dcl;
}SYM[MAX];

char symtab[][5]={"STOP","ADD","SUB","MUL","MOVER","MOVEM","COMP","BC","DIV","READ","PRINT"};
char directive[][10]={"START","END","ORIGIN","EQU"};
char regtab[][10]={"","AREG","BREG","CREG","DREG"};
char condtab[][5]={"LT","LE","EQ","GT","GE","ANY"};

int symbcnt,pc,tokcnt;
char srcfile[MAX],tok1[MAX],tok2[MAX],tok3[MAX],tok4[MAX],buffer[80];
FILE *fp;

int searchop(char *str)
{
int l;
for(l=0;l<11;l++)
{
if(strcmp(symtab[l],str)==0)
return l;
}
return -l;
}

int searchdir(char *str)
{
int l;
for(l=0;l<4;l++)
{
if(strcmp(directive[l],str)==0)
return l;
}
return -1;

}

int searchsymb(char *str)
{
int l;
for(l=0;l<=symbcnt;l++)
{
if(strcmp(SYM[l].name,str)==0)
return l;
}
return -l;
}

void DispSymtab()
{
int l;
for(l=0;l<symbcnt;l++)
{
if(SYM[l].used==0 && SYM[l].dcl==1)
printf("\n Symbol %s declared but not used",SYM[l].name);
if(SYM[l].used==1 &&SYM[l].dcl==0)
printf("\n Symbol %s used but not declared",SYM[l].name);

}
}

//int main(int argc,char *argv[])
//{
void main()
{
clrscr();
/*if(argc!=2)
{
printf("Wrong input\n");
exit(1);
}
strcpy(srcfile,argv[1]);
*/
pass1();
DispSymtab();
getch();
// return 0;
}



 pass1()
{
int i,j,k;
printf("Enter File Name");
scanf("%s",srcfile);
//puts(srcfile);
fp=fopen(srcfile,"r");
if(fp==NULL)
{
printf("File does not exist");
exit(0);
}
while(fgets(buffer,80,fp))
{
tokcnt=sscanf(buffer,"%s%s%s%s",tok1,tok2,tok3,tok4);
       // printf("%d",tokcnt);
switch(tokcnt)
{
case 2:
i=searchop(tok1);
if(i==9||i==10)
{
j=searchsymb(tok2);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok2);
SYM[symbcnt++].used=1;
}
else
SYM[j].used=1;
break;
}
i=searchdir(tok1);
if(i==0||i==2)
{
pc=atoi(tok2)-1;
}
else
{
i=searchop(tok2);
if(i==0)
{
j=searchsymb(tok1);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok1);
SYM[symbcnt].addr=pc;
SYM[symbcnt].value=0;
SYM[symbcnt].dcl=1;
SYM[symbcnt++].len=0;
}
else
{
if(SYM[j].dcl==1)
printf("\n Error at line %d:redeclaration of symbol:%s",pc,tok1);
else
{
SYM[j].addr=pc;
SYM[j].value=0;
SYM[j].dcl=1;
SYM[j].len=0;
}//else

} //else

}//if

}//else
break;
case 3:
     i=searchop(tok1);
     if(i>=1&&i<=8)
     {
j=searchsymb(tok3);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok3);
SYM[symbcnt++].used=1;

}//if
else
SYM[j].used=1;


     } //if
     else if(strcmp(tok2,"DC")==0)
     {
j=searchsymb(tok1);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok1);
SYM[symbcnt].addr=pc;
SYM[symbcnt].value=atoi(tok3);
SYM[symbcnt].dcl=1;
SYM[symbcnt++].len=1;
}
else
{
if(SYM[j].dcl==1)
{
printf("\nError at line %d :redeclaration of symb %s",pc,tok1);
}
else
{
SYM[j].addr=pc;
SYM[j].value=atoi(tok3);
SYM[j].dcl=1;
SYM[j].len=1;
}//else
}//else

     } //else if
     else if(strcmp(tok2,"DS")==0)
     {
j=searchsymb(tok1);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok1);
SYM[symbcnt].addr=pc;
SYM[symbcnt].value=atoi(tok3);
SYM[symbcnt].dcl=1;
SYM[symbcnt++].len=atoi(tok3);
}
else
{
if(SYM[j].dcl==1)
{
printf("\nError at line %d :redeclaration of symb %s",pc,tok1);
}
else
{
SYM[j].addr=pc;
SYM[j].value=0;
SYM[j].dcl=1;
SYM[j].len=atoi(tok3);
}//else
}//else
pc+=atoi(tok3)-1;
     }//else if
     else
     {
j=searchsymb(tok1);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok1);
SYM[symbcnt].addr=pc;
SYM[symbcnt].value=0;
SYM[symbcnt].dcl=1;
SYM[symbcnt++].len=0;
} //if
else
{       if(SYM[j].dcl==1)
printf("\n Error at line %d:redeclaration of symbol:%s",pc,tok1);
else
{
SYM[j].addr=pc;
SYM[j].value=0;
SYM[j].dcl=1;
SYM[j].len=0;
}//else
}//else
i=searchop(tok2);
if(i==9 || i==10)
{
j=searchsymb(tok3);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok3);
SYM[symbcnt++].used=1;
}
else
SYM[j].used=1;
}//if

     }//if
     break;
case 4:
j=searchsymb(tok1);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok1) ;
SYM[symbcnt].addr=pc;
SYM[symbcnt].value=0;
SYM[symbcnt].dcl=1;
SYM[symbcnt].len=0;
}//if
else
{
      if(SYM[j].dcl==1)
      printf("\n Error at line %d:redeclaration of symbol:%s",pc,tok1);
      else
      {
SYM[j].addr=pc;
SYM[j].value=0;
SYM[j].dcl=1;
SYM[j].len=0;
}//else
}//else
i=searchop(tok2);
if(i>=1 && i<=8)
{
j=searchsymb(tok4);
if(j==-1)
{
strcpy(SYM[symbcnt].name,tok4);
SYM[symbcnt++].used=1;
}
else
SYM[j].used=1;
}
break;

}//switch


}//while
 return 0;
}//pass1

/* OUTPUT   


START 100,2
READ A
MOVER A,AREG
BDD AREG,A
A MOVEM AREG,'=2'
STOP
x DS 1
y DS 1
END

START 100
READ A
B MOVER BREG,A
ADD BREG,A
A MOVEM AREG,Z
STOP
A DS 1
B DS 1
END

Enter File Namec:\neel\ass2.txt

Error at line 99 :redeclaration of symb A
Error at line 99 :redeclaration of symb B

Enter File Name c:\neel\ass3.txt

Error at line 99 :redeclaration of symb y

*/


??

??

??

??




1


??

??

??

??




2


No comments:

Post a Comment