This is a program for two pass assembler. This program uses static input source program. Shortage of time did not allow us to go for dynamic input. Dynamic program will be published after some time. The static input source program is in code[][] array. Field 1: Label, Field 2: Opcode, Field 3: Operand1, Field 4: Operand2. Please do comment for any queries.
Two-Pass Assembler
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main()
{
char *ptr;
char *code[9][4]={
{"","START","0",""},
{"","USING","*","14"},
{"","L","1","FIVE"},
{"","A","1","FOUR"},
{"","ST","1","TEMP"},
{"FOUR","DC","F","\"4\""},
{"FIVE","DC","F","\"5\""},
{"TEMP","DS","1F",""},
{"","END","",""}
};
char av[2],avail[15]={'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N'};
int i,j,k,count[3],lc[9]={0,0,0,0,0,0,0,0,0},loc=0,f=0;
clrscr();
printf("Input Program\n");
for(i=0;i<=8;i++)
{
for(j=0;j<=3;j++)
{
printf("%s\t",code[i][j]);
}
printf("\n");
}
printf("PASS 1 TABLE:\n---------------------------------------\n");
printf("LOC CNT\tLABEL\tOPCODE\tOP1\tOP2\n");
printf("---------------------------------------\n");
for(i=0;i<=8;i++)
{
if((strcmp(code[i][1],"START")!=0)&&(strcmp(code[i][1],"USING")!=0)&&(strcmp(code[i][1],"L")!=0))
lc[i]=lc[i-1]+4;
printf("%d\t",lc[i]);
if(strchr(code[i][3],'\"'))
printf("%s\t%s\t%s\t%s\n",code[i][0],code[i][1],code[i][2],code[i][3]);
else
printf("%s\t%s\t%s\n",code[i][0],code[i][1],code[i][2]);
}
printf("--------------------------------------");
getch();
printf("\n\nSYMBOL TABLE:\n----------------------------------------------------\n");
printf("SYMBOL\t\tVALUE\t\tLENGTH\t\tR/A");
printf("\n----------------------------------------------------\n");
for(i=0;i<9;i++)
{
/*if(strcmp(code[i][1],"START")==0)
{
printf("%s\t\t%d\t\t%d\t\t%c\n",code[i][0],loc,4,'R');
}
else*/ if(strcmp(code[i][0],"")!=0)
{
printf("%s\t\t%d\t\t%d\t\t%c\n",code[i][0],loc,4,'R');
loc=4+loc;
}
else if(strcmp(code[i][1],"USING")==0){}
else
{loc=4+loc;}
}
printf("----------------------------------------------------");
getch();
printf("\nLITERAL TABLE :\n----------------------------------------------------");
printf("\nLIT NAME\tVALUE\t\tLENGTH\t\tR/A\n");
printf("----------------------------------------------------\n");
for(i=0;i<=8;i++)
{
ptr=strchr(code[i][3],'\"');
if(ptr)
printf("%s\t\t%d\t\t%d\t\t%c\n",code[i][3],lc[i],4,'R');
}
printf("----------------------------------------------------");
getch();
clrscr();
printf("\n\nBASE TABLE:\n----------------------------------------\n");
printf("REG NO\t\tAVAILIBILITY\t");
printf("\n----------------------------------------\n");
for(j=0;j<=8;j++)
{
if(strcmp(code[j][1],"USING")!=0)
{}
else
{
strcpy(av,code[j][3]);
}
}
count[0]=(int)av[0]-48;
count[1]=(int)av[1]-48;
count[2]=count[0]*10+count[1];
avail[count[2]-1]='Y';
for(k=0;k<16;k++)
{
printf(" %d\t\t %c\n",k,avail[k-1]);
}
printf("----------------------------------------\n");
getch();
clrscr();
printf("PASS2 TABLE:\n-------------------------------------\n");
printf("LOC CNT\tLABEL\tOPCODE\tOP1\tOP2");
printf("\n-------------------------------------\n");
loc=0;
for(i=0;i<=8;i++)
{
f=0;
for(j=i;j<=7;j++)
{
if(strcmp(code[i][3],code[j][0])==0)
{
printf("%d\t%s\t%s\t%s\t%d\n",lc[i],code[i][0],code[i][1],code[i][2],lc[j]);
f=1;
break;
}
}
if(f==0)
printf("%d\t%s\t%s\t%s\t%s\n",lc[i],code[i][0],code[i][1],code[i][2],code[i][3]);
}
printf("-------------------------------------");
getch();
}
Output
Input Program
START 0
USING * 14
L 1 FIVE
A 1 FOUR
ST 1 TEMP
FOUR DC F "4"
FIVE DC F "5"
TEMP DS 1F
END
PASS 1 TABLE:
---------------------------------------
LOC CNT LABEL OPCODE OP1 OP2
---------------------------------------
0 START 0
0 USING *
0 L 1
4 A 1
8 ST 1
12 FOUR DC F "4"
16 FIVE DC F "5"
20 TEMP DS 1F
24 END
--------------------------------------
SYMBOL TABLE:
----------------------------------------------------
SYMBOL VALUE LENGTH R/A
----------------------------------------------------
FOUR 16 4 R
FIVE 20 4 R
TEMP 24 4 R
----------------------------------------------------
LITERAL TABLE :
----------------------------------------------------
LIT NAME VALUE LENGTH R/A
----------------------------------------------------
"4" 12 4 R
"5" 16 4 R
----------------------------------------------------
BASE TABLE:
----------------------------------------
REG NO AVAILIBILITY
----------------------------------------
0
1 N
2 N
3 N
4 N
5 N
6 N
7 N
8 N
9 N
10 N
11 N
12 N
13 N
14 Y
15 N
----------------------------------------
PASS2 TABLE:
-------------------------------------
LOC CNT LABEL OPCODE OP1 OP2
-------------------------------------
0 START 0 0
0 USING * 14
0 L 1 16
4 A 1 12
8 ST 1 20
12 FOUR DC F "4"
16 FIVE DC F "5"
20 TEMP DS 1F
24 END
-------------------------------------
No comments:
Post a Comment