C Program for the Implementation of Pass Two of a Two Pass Assembler | CS1207 - System Software Laboratory


AIM:
           To write a "C" program for the implementation of pass two of a two pass assembler in CS1207 - System Software Lab.


SOURCE CODE:

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
  char a[10],ad[10],label[10],opcode[10],operand[10],symbol[10],ch;  int st,diff,i,address,add,len,actual_len,finaddr,prevaddr,j=0;
  char mnemonic[15][15]={"LDA","STA","LDCH","STCH"};
  char code[15][15]={"33","44","53","57"};
  FILE *fp1,*fp2,*fp3,*fp4;
  clrscr();
  fp1=fopen("ASSMLIST.DAT","w");
  fp2=fopen("SYMTAB.DAT","r");
  fp3=fopen("INTERMED.DAT","r");
  fp4=fopen("OBJCODE.DAT","w");
  fscanf(fp3,"%s%s%s",label,opcode,operand);

  while(strcmp(opcode,"END")!=0)
  {
   prevaddr=address;
   fscanf(fp3,"%d%s%s%s",&address,label,opcode,operand);
  }
  finaddr=address;
  fclose(fp3);
  fp3=fopen("INTERMED.DAT","r");

  fscanf(fp3,"%s%s%s",label,opcode,operand);
  if(strcmp(opcode,"START")==0)
  {
   fprintf(fp1,"\t%s\t%s\t%s\n",label,opcode,operand);
   fprintf(fp4,"H^%s^00%s^00%d\n",label,operand,finaddr);
   fscanf(fp3,"%d%s%s%s",&address,label,opcode,operand);
   st=address;
   diff=prevaddr-st;
   fprintf(fp4,"T^00%d^%d",address,diff);
  }
  while(strcmp(opcode,"END")!=0)
  {
   if(strcmp(opcode,"BYTE")==0)
   {
    fprintf(fp1,"%d\t%s\t%s\t%s\t",address,label,opcode,operand);
    len=strlen(operand);
    actual_len=len-3;
    fprintf(fp4,"^");
    for(i=2;i<(actual_len+2);i++)
    {
     itoa(operand[i],ad,16);
     fprintf(fp1,"%s",ad);
     fprintf(fp4,"%s",ad);
    }
    fprintf(fp1,"\n");
   }
   else if(strcmp(opcode,"WORD")==0)
   {
    len=strlen(operand);
    itoa(atoi(operand),a,10);
    fprintf(fp1,"%d\t%s\t%s\t%s\t00000%s\n",address,label,opcode,operand,a);
    fprintf(fp4,"^00000%s",a);
   }
   else if((strcmp(opcode,"RESB")==0)||(strcmp(opcode,"RESW")==0))
    fprintf(fp1,"%d\t%s\t%s\t%s\n",address,label,opcode,operand);
   else
   {
    while(strcmp(opcode,mnemonic[j])!=0)
     j++;
    if(strcmp(operand,"COPY")==0)
     fprintf(fp1,"%d\t%s\t%s\t%s\t%s0000\n",address,label,opcode,operand,code[j]);
    else
    {
     rewind(fp2);
     fscanf(fp2,"%s%d",symbol,&add);
      while(strcmp(operand,symbol)!=0)
       fscanf(fp2,"%s%d",symbol,&add);
     fprintf(fp1,"%d\t%s\t%s\t%s\t%s%d\n",address,label,opcode,operand,code[j],add);
     fprintf(fp4,"^%s%d",code[j],add);
    }
   }
   fscanf(fp3,"%d%s%s%s",&address,label,opcode,operand);
  }
  fprintf(fp1,"%d\t%s\t%s\t%s\n",address,label,opcode,operand);
  fprintf(fp4,"\nE^00%d",st);
  printf("\n Intermediate file is converted into object code");
  fcloseall();

  printf("\n\nThe contents of Intermediate file:\n\n\t");
  fp3=fopen("INTERMED.DAT","r");
  ch=fgetc(fp3);
  while(ch!=EOF)
  {
   printf("%c",ch);
   ch=fgetc(fp3);
  }
  printf("\n\nThe contents of Symbol Table :\n\n");
  fp2=fopen("SYMTAB.DAT","r");
  ch=fgetc(fp2);
  while(ch!=EOF)
  {
   printf("%c",ch);
   ch=fgetc(fp2);
  }
  printf("\n\nThe contents of Output file :\n\n");
  fp1=fopen("ASSMLIST.DAT","r");
  ch=fgetc(fp1);
  while(ch!=EOF)
  {
   printf("%c",ch);
   ch=fgetc(fp1);
  }
  printf("\n\nThe contents of Object code file :\n\n");
  fp4=fopen("OBJCODE.DAT","r");
  ch=fgetc(fp4);
  while(ch!=EOF)
  {
   printf("%c",ch);
   ch=fgetc(fp4);
  }
  fcloseall();
  getch();
}

INPUT FILES:

INTERMED.DAT
COPY    START    2000
2000    **    LDA    FIVE
2003    **    STA    ALPHA
2006    **    LDCH    CHARZ
2009    **    STCH    C1
2012    ALPHA    RESW    1
2015    FIVE    WORD    5
2018    CHARZ    BYTE    C'EOF'
2019    C1    RESB    1
2020    **    END    **

SYMTAB.DAT
ALPHA    2012
FIVE    2015
CHARZ    2018
C1    2019

OUTPUT:


Related Posts:
  • IMPLEMENTATION OF PASS TWO OF A TWO PASS ASSEMBLER
Previous
Next Post »

Still not found what you are looking for? Try again here.