You are on page 1of 14

// Name:Vishnu Balachandran //

// 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;

void hadd(char a[],char b[])


{
int b1=0,c1=0,t1,p1,i,j,flag;

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++)
{

if(source[i][j]==' ' && flag==2)


{
q=0;
flag++;j++;
}
if(source[i][j]==' ' && flag==1)
{
sym[k]=p;
q=0;
flag++;j++;
}
if(flag==1)
symtab[k][q]=source[i][j];
if(flag==2)
op[l][q]=source[i][j];
if(flag==3)
val[m][q]=source[i][j];
if(source[i][j]==' ' && flag==3)
{
val[m][q+1]=' ';
break;
}
}
val[m][strlen(val[m])-2]='\0';
symtab[k][strlen(symtab[k])]='\0';
m++;l++;k++;
}
n=k;
int lcc;
for(i=0;i<k;i++)
sym[i]=sym[i]-3;
sym[0]=sym[0]+3;

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);}
}

printf("\nSYMBOL TABLE generated\n");

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);
}

printf("INTERMEDIATE FILE generated\n");


}

void main()
{
pass1();
}
OUTPUT

input.txt
---------

COPY START 1000


FIRST LDA RETADR
CLOOP JSUB RDREC
LDA LENGTH
COMP ZERO
JEQ ENDFIL
JSUB WRREC
J CLOOP
ENDFIL LDA EOF
STA BUFFER
LDA THREE
STA LENGTH
JSUB WRREC
LDL RETADR
RSUB 00
EOF BYTE C'EOF'
THREE WORD 3
ZERO WORD 0
RETADR RESW 1
LENGTH RESW 1
BUFFER RESB 4096
RDREC LDX ZERO
LDA ZERO
RLOOP TD INPUT
JEQ RLOOP
RD INPUT
COMP ZERO
JEQ EXIT
TIX MAXLEN
JLT RLOOP
EXIT STX LENGTH
RSUB 00
INPUT BYTE X'F1'
MAXLEN WORD 4096
WRREC LDX ZERO
WLOOP TD OUTPUT
JEQ WLOOP
LDCH BUFFER
WD OUTPUT
TIX LENGTH
JLT WLOOP
RSUB 00
OUTPUT BYTE X'05'
END FIRST
intermediate.txt
----------------

1000 START 1000


1000 LDA RETADR
1003 JSUB RDREC
1006 LDA LENGTH
1009 COMP ZERO
100C JEQ ENDFIL
100F JSUB WRREC
1012 J CLOOP
1015 LDA EOF
1018 STA BUFFER
101B LDA THREE
101E STA LENGTH
1021 JSUB WRREC
1024 LDL RETADR
1027 RSUB 00
102A BYTE C'EOF'
102D WORD 3
1030 WORD 0
1033 RESW 1
1036 RESW 1
1039 RESB 4096
2039 LDX ZERO
203C LDA ZERO
203F TD INPUT
2042 JEQ RLOOP
2045 RD INPUT
2048 COMP ZERO
204B JEQ EXIT
204E TIX MAXLEN
2051 JLT RLOOP
2054 STX LENGTH
2057 RSUB 00
205A BYTE X'F1'
205B WORD 4096
205E LDX ZERO
2061 TD OUTPUT
2064 JEQ WLOOP
2067 LDCH BUFFER
206A WD OUTPUT
206D TIX LENGTH
2070 JLT WLOOP
2073 RSUB 00
2076 BYTE X'05'
2077 END FIRST
symtab.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];

int srs(char a[])


{
int i;
char ab[25];
for(i=0;i<k;i++){
strcpy(ab,symtab[i]);
if(strcmp(ab,a)==0)
return(i);
}
return(0);
}

int srop(char a[])


{
int i;
for(i=0;i<23;i++)
{if(!strcmp(optab[i],a))
{strcpy(opp,opcode[i]);
return(1);
}
}
return(0);
}
void fn1()
{
int flag,i,j,p,q;

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);
}

printf("\nOBJECT FILE generated\n");

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
----------------

1000 START 1000


1000 LDA RETADR
1003 JSUB RDREC
1006 LDA LENGTH
1009 COMP ZERO
100C JEQ ENDFIL
100F JSUB WRREC
1012 J CLOOP
1015 LDA EOF
1018 STA BUFFER
101B LDA THREE
101E STA LENGTH
1021 JSUB WRREC
1024 LDL RETADR
1027 RSUB 00
102A BYTE C'EOF'
102D WORD 3
1030 WORD 0
1033 RESW 1
1036 RESW 1
1039 RESB 4096
2039 LDX ZERO
203C LDA ZERO
203F TD INPUT
2042 JEQ RLOOP
2045 RD INPUT
2048 COMP ZERO
204B JEQ EXIT
204E TIX MAXLEN
2051 JLT RLOOP
2054 STX LENGTH
2057 RSUB 00
205A BYTE X'F1'
205B WORD 4096
205E LDX ZERO
2061 TD OUTPUT
2064 JEQ WLOOP
2067 LDCH BUFFER
206A WD OUTPUT
206D TIX LENGTH
2070 JLT WLOOP
2073 RSUB 00
2076 BYTE X'05'
2077 END FIRST
symtab.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

You might also like