2 pass assembler in c
pass1:
#include<stdio.h>
#include<string.h>
void main()
{
int lc; int s,num,f=0,f1,l,i,n=0;
FILE *fp1,*fp2,*fp3;
char lab[10],op[10],val[10];
char a[15][15]={{'S','T','A'},{'S','T','L'},{'L','D','A'},{'L','D','B'},{'J'},{'J','E','Q'},{'J','S','U','B'},{'C','O','M','P'},{'S','T','C','H'},{'R','E','S','W'},{'R','E','S','B'},{'W','O','R','D'},{'B','Y','T','E'}};
char b[20][10];
fp1=fopen("INPUT.DAT","r");
fp2=fopen("SYMTAB.DAT","w");
fp3=fopen("INTER.DAT","w");
fscanf(fp1,"%s\t%s",lab,op);
if(strcmp(op,"START")==0)
{
fscanf(fp1,"%x",&lc);
fprintf(fp3,"%x\t%s\t%s\t%x\n",lc,lab,op,lc);
}
s=lc;
while(!feof(fp1))
{
fscanf(fp1,"%s\t%s\t%s",lab,op,val);
if(strcmp(op,"END")!=0)
{
for(i=0;i<13;i++)
{
if(strcmp(op,a[i])==0)
{
f1=0;
break;
}
f1=1;
}
if(strcmp(lab,"$")!=0)
{
for(i=0;i<n;i++)
{
if(strcmp(lab,b[i])==0)
{
f=1;
break;
}
f=0;
}
if(f==0)
{
fprintf(fp2,"%s\t%x\n",lab,lc);
strcpy(b[n++],lab);
}
}
fprintf(fp3,"%x\t%s\t%s\t%s\n",lc,lab,op,val);
if(f==1)
fprintf(fp3,"ERROR:SYMBOL ALREADY DEFINED\n");
if(f1==1)
fprintf(fp3,"ERROR:WRONG OPCODE\n");
num=atoi(val);
if(strcmp(op,"RESW")==0)
lc=lc+(num*3);
else if(strcmp(op,"RESB")==0)
lc=lc+num;
else if(strcmp(op,"BYTE")==0)
{
num=strlen(val)-3;
lc=lc+num;
}
else if(strcmp(op,"WORD")==0)
lc=lc+3;
else
lc=lc+3;
}
}
fprintf(fp3,"%x\t%s\t%s\t%s\n",lc,lab,op,val);
l=lc-s;
fprintf(fp3,"PROGRAMLENGTH %x",l);
fcloseall();
}
pass2:
#include<stdio.h>
#include<string.h>
#define q 11//N0. of elements in array A
void main()
{
int lc,ad,address,t=0;
int s,num,l,i=0,j,n,len,ni=0;
FILE *fp1,*fp2,*fp3;
char lab[10],op[10],val[10],code[10];
char a[15][15]={"STA","STL","LDA","LDB","J","JEQ","JSUB","COMP","STCH","ADD","SUB"};
char b[20][15]={"14","32","03","69","34","30","48","28","24","16","0C"};
char sym[15][10];
int symadd[15];
fp1=fopen("INTER.DAT","r");
fp2=fopen("SYMTAB1.DAT","r");
fp3=fopen("OUTPUT.DAT","w");
fscanf(fp1,"%x\t%s\t%s\t%s",&ad,lab,op,val);
while(strcmp(op,"END")!=0)
{
fscanf(fp1,"%x\t%s\t%s\t%s",&ad,lab,op,val);
t++;
}
t--;
fscanf(fp1,"%s%x",val,&len);
fclose(fp1);
fp1=fopen("INTER.DAT","r");
fscanf(fp1,"%x\t%s\t%s",&ad,lab,op);
if(strcmp(op,"START")==0)
{
fscanf(fp1,"%x",&lc);
fprintf(fp3,"H^%s^00%x^%x\n",lab,lc,len);
fprintf(fp3,"T^00%x^",lc);
if(t>10)
{
fprintf(fp3,"1E");
t=t-10;
}
else
fprintf(fp3,"%x",t*3);
}
s=lc;
while(!feof(fp2))
{
fscanf(fp2,"%s\t%x",sym[i],&symadd[i]);
i++;
}
n=i;
while(!feof(fp1))
{
fscanf(fp1,"%x\t%s\t%s\t%s",&ad,lab,op,val);
if(strcmp(op,"END")!=0)
{
if(strcmp(op,"RESW")!=0&&strcmp(op,"RESB")!=0&&strcmp(op,"WORD")!=0)
{
if(strcmp(op,"BYTE")==0)
{
for(i=2,j=0;i<strlen(val)-1;i++)
{
code[j]=val[i];
j++;
}
code[j]='\0';
fprintf(fp3,"^%s",code);
ni++;
}
else
{
for(i=0;i<q;i++)
{
if(strcmp(op,a[i])==0)
{
strcpy(code,b[i]);
break;
}
}
for(i=0;i<n;i++)
{
if(strcmp(val,sym[i])==0)
{
address=symadd[i];
break;
}
}
if(ni<10)
{
fprintf(fp3,"^%s%x",code,address);
ni++;
}
else
{
fprintf(fp3,"T^00%x^",lc);
if(t>10)
{
fprintf(fp3,"1E");
t=t-10;
}
else
fprintf(fp3,"%x",t*3);
ni=0;
}
}
}
}
else
break;
}
fprintf(fp3,"\nE^00%x",s);
fcloseall();
}
instrutui
1.Copy all the contents into turboc3
2.Execute the "PASS1.C" program
3.Execute "PASS2.C" program
Note:The output of "PASS1.C" is used as the input to "PASS2.C"
×