Implement Pass One of A Two Pass Assembler

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
char label[10],inst[10],op1[10],op2[10];
/*
op1,op2->operand
*/
char buff[10];
int a,b,loctr=0,ctr,flag,d[5];
FILE *fp1,*fp2,*fp3,*fp4;
//clrscr();
 fp1=fopen("INPUT.TXT","r");
 fp2=fopen("OUTPUT.TXT","w");
 fp3=fopen("OPTAB.TXT","r");
 fp4=fopen("SYM.TXT","w");
 fprintf(fp4,"\tSYMBOL TABLE\n");
 fprintf(fp4,"LABEL\tADDRESS\n");
 buff[0]='\0';
 fscanf(fp1,"%s%s%s%s",label,inst,op1,op2);
if(strcmp(inst,"START")==0)
{
 a=atoi(op1);
 loctr=a;
 fprintf(fp2,"\nADDRESS\tMNEMONICS");
 fprintf(fp2,"\n%d\t%s\t%s\t%s\n",loctr,label,inst,op1);
}
else
 loctr=0;
while(!feof(fp1))
{
 fscanf(fp1,"%s%s%s%s",label,inst,op1,op2);
        if(strcmp(inst,"END")!=0)
        {
  if(strcmp(label,"$")!=0)
  fprintf(fp4,"\n%s\t%d",label,loctr);
  while(!feof(fp3))
  {
   fscanf(fp3,"%s%d",buff,&d);
               if(strcmp(inst,buff)==0)
               {
    flag=1;
    break;
                }
  }
                b=atoi(op1);
               if(strcmp(inst,"WORD")==0)
        loctr+=3;
               else if(strcmp(inst,"RESW")==0)
        loctr+=3*b;
               else if(strcmp(inst,"RESB")==0)
        loctr+=b;
               else if(strcmp(inst,"BYTE")==0)
        loctr+=1;
              else if(flag)
       loctr+=3;
          }
 fprintf(fp2,"%d\t%s\t%s\t%s\n",loctr,label,inst,op1);
   }
 fprintf(fp2,"\n\nPRGLEN=%d\n",(loctr-a));
 fclose(fp1);
 fclose(fp2);
 fclose(fp3);
 fclose(fp4);
}


Output Files :

SYM.TXT


SYMBOL TABLE
LABEL ADDRESS

FIRST         1000
BUFFER 1006
RETADR 1014

OUTPUT.TXT


ADDRESS MNEMONICS
1000 COPY START 1000
1003 FIRST STL RETADR
1006 $ STA BUFFER
1014 BUFFER RESB 08
1023 RETADR RESW 03
1023 $ END FIRST


PRGLEN=23




No comments: