Professional Documents
Culture Documents
// Roll No:6058 //
// Program: Pass 1 of SIC Assembler //
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char symtab[150][20];
int sym[150];
char symh[150][5];
char op[150][20];
char val[150][20];
char source[200][100];
int k=0,l=0,m=0;
int n;
for(i=0;i<4;i++)
{
if(a[i]>='A')
t1=a[i]-'A'+10;
else
t1=a[i]-'0';
if(b[i]>='A')
p1=b[i]-'A'+10;
else
p1=b[i]-'0';
b1=b1*16+t1;
c1=c1*16+p1;
}
b1=b1+c1;
for(j=3,flag=b1;j>=0;j--)
{
a[j]=flag%16;
if((flag%16)<10)
a[j]=a[j]+48;
else
a[j]=a[j]+55;
flag=flag/16;
}
a[4]='\0';
}
void pass1()
{
FILE *fp;
int flag,i,j,p,q;
FILE *fp1,*fp2;
k=0;
fp=fopen("input.txt","r");
fp1=fopen("intermediate.txt","w");
fp2=fopen("symtab.txt","w");
for(i=0;fgets(source[i],100,fp);i++)
{
}
n=i-1;
for(i=0,p=0;i<n;i++,p=p+3)
{
while(source[i][0]=='.')
i++;
for(j=0,q=0,flag=1;source[i][j]!='\0';j++,q++)
{
for(i=0;i<k;i++)
{
if(!strcmp(op[i],"BYTE"))
{
lcc=strlen(val[i]);
lcc=lcc-3;
if(val[i][0]=='X')
if(lcc%2)
lcc=(lcc/2)+1;
else
lcc=lcc/2;
for(j=i+1;j<k;j++)
sym[j]=sym[j]+lcc-3;
}
if(!strcmp(op[i],"RESW"))
{
lcc=atoi(val[i]);
lcc=3*lcc;
for(j=i+1;j<k;j++)
sym[j]=sym[j]+lcc-3;
}
if(!strcmp(op[i],"RESB"))
{
lcc=atoi(val[i]);
for(j=i+1;j<k;j++)
sym[j]=sym[j]+lcc-3;
}
}
for(i=0;i<k;i++)
{
for(j=3,flag=sym[i];j>=0;j--)
{
symh[i][j]=flag%16;
if((flag%16)<10)
symh[i][j]=symh[i][j]+48;
else
symh[i][j]=symh[i][j]+55;
flag=flag/16;
}
symh[i][4]='\0';
}
for(i=0;i<k;i++)
hadd(symh[i],val[0]);
for(i=0;i<k;i++)
{
if(strlen(symtab[i])>0){
fputs(symtab[i],fp2);
fputs(" ",fp2);
fputs(symh[i],fp2);
fputs("\n",fp2);}
}
for(i=0;i<l;i++)
{
fputs(symh[i],fp1);
fputs(" ",fp1);
fputs(op[i],fp1);
fputs(" ",fp1);
fputs(val[i],fp1);
fputs("\n",fp1);
}
void main()
{
pass1();
}
OUTPUT
input.txt
---------
COPY 1000
FIRST 1000
CLOOP 1003
ENDFIL 1015
EOF 102A
THREE 102D
ZERO 1030
RETADR 1033
LENGTH 1036
BUFFER 1039
RDREC 2039
RLOOP 203F
EXIT 2054
INPUT 205A
MAXLEN 205B
WRREC 205E
WLOOP 2061
OUTPUT 2076
// Name:Vishnu Balachandran //
// Roll No:6058 //
// Program: Pass 2 of SIC Assembler //
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char optab[23][5]=
{"WD","RD","TD","RSUB","LDCH","COMP","JSUB","J","LDA","STA","LDX","STX","LDB","STB",
"ADD","SUB","MUL","DIV","JLT","JGT","JEQ","TIX","LDL"};
char opcode[23][2]=
{"00","04","08","10","14","18","20","24","28","30","34","38","40","44","48","50","54","58","60","64","
68","70","74"};
char symtab[150][20];
int sym[150];
char symh[150][5];
char lc[150][5];
char op[150][20];
char val[150][20];
char obj[200][25];
char source1[200][100];
char source2[200][100];
int k=0,l=0,m=0;
int n,n1;
char opp[2];
FILE *fp1,*fp2;
fp1=fopen("intermediate.txt","r");
fp2=fopen("symtab.txt","r");
for(i=0;fgets(source1[i],100,fp1);i++);
n=i;
for(i=0;fgets(source2[i],100,fp2);i++);
n1=i;
for(i=0;i<n;i++,p=p+3)
{
for(j=0,q=0,flag=1;source1[i][j]!='\0';j++,q++)
{
if(source1[i][j]==' ' && flag==2)
{
q=0;
flag++;j++;
}
if(source1[i][j]==' ' && flag==1)
{
q=0;
flag++;j++;
}
if(flag==1)
lc[p][q]=source1[i][j];
if(flag==2)
op[l][q]=source1[i][j];
if(flag==3)
val[m][q]=source1[i][j];
}
val[m][q-1]='\0';
m++;l++;
}
for(i=0,p=0;i<n;i++,p=p+3)
{
for(j=0,q=0,flag=1;source2[i][j]!='\0';j++,q++)
{
if(source2[i][j]==' ' && flag==1)
{
q=0;
flag++;j++;
}
if(flag==1)
symtab[k][q]=source2[i][j];
if(flag==2)
symh[k][q]=source2[i][j];
}
symh[k][q-1]='\0';
k++;
}
}
void pass2()
{
fn1();
int j,i,t=0,z=0;
char xc[6];
for(j=2,z=0;z<strlen(symtab[0]);j++,z++)
obj[t][j]=symtab[0][z];
obj[t][j]='^';j++;
obj[t][j]='0';j++;
obj[t][j]='0';j++;
obj[t][j]=lc[0][0];j++;
obj[t][j]=lc[0][1];j++;
obj[t][j]=lc[0][2];j++;
obj[t][j]=lc[0][3];j++;
sprintf(xc,"%06d",n);
obj[t][j]='^';j++;
obj[t][j]=xc[0];j++;
obj[t][j]=xc[1];j++;
obj[t][j]=xc[2];j++;
obj[t][j]=xc[3];j++;
obj[t][j]=xc[4];j++;
obj[t][j]=xc[5];j++;
t++;
obj[t][0]='T';i=0;
obj[t][1]='^';
obj[t][2]='0';
obj[t][3]='0';
obj[t][4]=lc[i][0];
obj[t][5]=lc[i][1];
obj[t][6]=lc[i][2];
obj[t][7]=lc[i][3];
obj[t][8]='^';
n=10*3;
if((n%16)<10)
obj[t][10]=n%16+48;
else
obj[t][10]=n%16+55;
if(((n/16)%16)<10)
obj[t][9]=(n/16)%16+48;
else
obj[t][9]=(n/16)%16+55;
obj[t][11]='^'; z=t;
for(i=1,t=2;i<k;i++,t++)
{
if(t%10==0)
{
obj[t][0]='T';
obj[t][1]='^';
obj[t][2]='0';
obj[t][3]='0';
obj[t][4]=lc[i][0];
obj[t][5]=lc[i][1];
obj[t][6]=lc[i][2];
obj[t][7]=lc[i][3];
obj[t][8]='^';
n=(t-z)*3;
if((n%16)<10)
obj[t][10]=n%16+48;
else
obj[t][10]=n%16+55;
if(((n/16)%16)<10)
obj[t][9]=(n/16)%16+48;
else
obj[t][9]=(n/16)%16+55;
z=t;
t++;
}
int b=srs(val[i]);
obj[t][2]=symh[b][0];
obj[t][3]=symh[b][1];
obj[t][4]=symh[b][2];
obj[t][5]=symh[b][3];
if(srop(op[i]))
{
obj[t][0]=opp[0];
obj[t][1]=opp[1];
}
if(!strcmp(op[i],"WORD"))
sprintf(obj[t],"%06d",atoi(val[i]));
if(!strcmp(op[i],"BYTE"))
strcpy(obj[t],val[i]);
if(!strcmp(op[i],"END"))
{
obj[t][0]='E';
obj[t][1]='0';
obj[t][2]='0';
obj[t][3]=lc[0][0];
obj[t][4]=lc[0][1];
obj[t][5]=lc[0][2];
obj[t][6]=lc[0][3];
}
}
obj[0][0]='H';
obj[0][1]='^';
FILE *fp3;
fp3=fopen("output.txt","w");
for(i=0;i<t;i++)
{
fputs(obj[i],fp3);
if(i>1&&obj[i+1][0]!='T'&&obj[i+1][0]!='E'&&i<t-1)
fputs("^",fp3);
if(obj[i+1][0]=='T'||obj[i+1][0]=='E')
fputs("\n",fp3);
}
void main()
{
int o,i;
for(i=0;i<3;i++)
optab[i][2]='\0';
strcpy(optab[3],"RSUB");
strcpy(optab[4],"COMP");
strcpy(optab[5],"LDCH");
strcpy(optab[6],"JSUB");
strcpy(optab[7],"J");
for(i=8;i<23;i++)
optab[i][3]='\0';
pass2();
}
OUTPUT
intermediate.txt
----------------
COPY 1000
FIRST 1000
CLOOP 1003
ENDFIL 1015
EOF 102A
THREE 102D
ZERO 1030
RETADR 1033
LENGTH 1036
BUFFER 1039
RDREC 2039
RLOOP 203F
EXIT 2054
INPUT 205A
MAXLEN 205B
WRREC 205E
WLOOP 2061
OUTPUT 2076
output.txt
----------
H^COPY^001000^000044
T^001000^1E^281033^202039^281036^141030^681015^20205E^241003^28102A
T^001006^1B^301039^28102D^301036^20205E^741033^1074^C'EOF'^000003^000000
T^00100F^1E^281030^08205A^68203F^04205A^141030^682054^70205B^60203F
T^00101B^1E^381036^106870^X'F1'^004096^341030^082076^682061^181039^002076
T^001024^0B^701036^602061^105458^X'05'
E001000