Implement A Two Pass of A Two Pass Assembler

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
FILE *fp1,*fp2,*fp3,*fp4;
void main()
{
 char code[2],addr[6],buff[10],add[5],inst[10],op1[10],op2[10];
 char symval[5],lab[10],obj[6],a[6],label[10];
 int flag;
 fp1=fopen("D1.TXT","r");
 fp2=fopen("D2.TXT","w");
 buff[0]='\0';
 fscanf(fp1,"%s%s%s%s%s",&addr,&label,&inst,&op1,&op2);
 strcpy(a,op1);
  if(strcmp(inst,"START")==0)
  {
   fprintf(fp2,"\nADDRESS\tMNEMONICS\tINSTRUCTION\n");
   fprintf(fp2,"%s\t%s\t%s\t%s\n",addr,label,inst,op1);
  }
  while(!feof(fp1))
  {
   flag=0;
   fscanf(fp1,"%s%s%s%s%s",&addr,&label,&inst,&op1,&op2);
   if(strcmp(inst,"END")!=0)
   {
    fp3=fopen("OPTAB.TXT","r");
    while(!feof(fp3))
    {
     fscanf(fp3,"%s%s",buff,code);
     if(strcmp(inst,buff)==0)
     {
      flag=1;
      break;
     }
    }fclose(fp3);
    if(flag)
    {
     if(strcmp(op1,"$")!=0)
     {
      fp4=fopen("SYM.TXT","r");
      while(!feof(fp4))
      {
       fscanf(fp4,"%s%s",lab,add);
       if(strcmp(op1,lab)==0)
       {
        strcpy(symval,add);
        break;
       }
      }
     }
     else
     strcpy(symval,"");
     fclose(fp4);
    }
    if(strcmp(label,"$")==0||strcmp(label,""))
    obj[0]=code[0];
    obj[1]=code[1];
    obj[2]=symval[0];
    obj[3]=symval[1];
    obj[4]=symval[2];
    obj[5]=symval[3];
    obj[6]='\0';
     if((strcmp(inst,"WORD")==0)||(strcmp(inst,"BYTE")==0))
     fprintf(fp2,"%s\t%s\t%s\t%s\t%s\n",addr,label,inst,op1,op2);
     else if((strcmp(inst,"RESW")==0)||(strcmp(inst,"RESB")==0))
     fprintf(fp2,"%s\t%s\t%s\t%s\t%s\n",addr,label,inst,op1,op2);
     else
     fprintf(fp2,"%s\t%s\t%s\t%s\t%s\n",addr,label,inst,symval,obj);
   }
  }
fprintf(fp2,"%s\t%s\t%s\t%s\t%s\n",addr,label,inst,op1,op2);
fclose(fp1);
fclose(fp2);
}


Input File :

D1.TXT


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

OPTAB.TXT

STA 14
STL 32
LDA 03
LDB 69
JSUD 48
JEQ 30
COMP 28
STCH 34

SYM.TXT

SYMBOL TABEL
LABEL ADDRESS
FIRST 1000
BUFFER 1006
RETADR 1014

Output File :

D2.TXT


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








No comments: