Problem Statement: Write a program to implement Two Pass Assembler.
Solution:
import java.util.*;
import java.io.*;
class twopass
{
static int lc=0,index=0;
static String litrl[][]=new String[10][4]; //assumning 10 literals
static int base_table[][]=new int[10][2]; //assuming 10 entries
public static void main(String args[])
{
pass1();
pass2();
}
static void pass1()
{
try
{
int val=0,potflag=0,i;
String inpt,strng=null,mot;
String lit[]=new String[1];
BufferedReader inp = new BufferedReader(new FileReader(“input.txt”));
File syt = new File(“symbol_table.txt”);
if (!syt.exists())
syt.createNewFile();
BufferedWriter sy = new BufferedWriter(new FileWriter(syt.getAbsoluteFile()));
File ltt = new File(“literal_table.txt”);
if (!ltt.exists())
ltt.createNewFile();
BufferedWriter lt = new BufferedWriter(new FileWriter(ltt.getAbsoluteFile()));
File p1op = new File(“pass1output.txt”);
if (!p1op.exists())
p1op.createNewFile();
BufferedWriter op = new BufferedWriter(new FileWriter(p1op.getAbsoluteFile()));
for(;(inpt=inp.readLine())!=null;val=potflag=0)
{
StringTokenizer st=new StringTokenizer(inpt);
String str[]=new String[st.countTokens()];
for(i=0;i<str.length;i++)
str[i]=st.nextToken();
if(str.length==3)
val=1;
if(str.length!=1)
{
StringTokenizer stkn=new StringTokenizer(str[val+1],”,”); //delimiter is comma
lit=new String[stkn.countTokens()];
for(i=0;i<lit.length;i++)
lit[i]=stkn.nextToken();
}
if(str[val].equalsIgnoreCase(“DS”) || str[val].equalsIgnoreCase(“DC”)) //checking whether it is in pot
{
int l=0;
if (val==1)
strng=str[0]+” “+lc+” 4 R”;
if(lit[0].indexOf(“F”)!=0)
{
l=Integer.parseInt(lit[0].substring(0,lit[0].length()-1));
l*=4;
}
else
for(i=0;i<lit.length;i++)
l+=4;
lc+=l;
}
else
{
if(str[val].equalsIgnoreCase(“EQU”))
{
if(str[2].equals(“*”))
strng=str[0]+” “+lc+” 1 R”;
else
strng=str[0]+” “+str[2]+” 1 A”;
}
else
{
if(str[val].equalsIgnoreCase(“START”))
strng=str[0]+” “+str[2]+” 1 R”;
else
{
if(str[val].equalsIgnoreCase(“LTORG”))
ltorg(true);
else
{
if(str[val].equalsIgnoreCase(“END”))
ltorg(false);
else potflag=1;
}
}
}
}
if(potflag==1) //mot search
{
if(str.length!=1)
{
for(i=0;i<lit.length;i++)
if(lit[i].charAt(0)==’=’)
{
litrl[index][0]=lit[i].substring(1,lit[i].length());
litrl[index][1]=”-1″;
litrl[index][2]=”4″;
litrl[index++][3]=”R”;
}
}
BufferedReader mt = new BufferedReader(new FileReader(“mot.txt”));
while((mot=mt.readLine())!=null)
{
StringTokenizer stk=new StringTokenizer(mot);
String s[]=new String[stk.countTokens()];
for(i=0;i<s.length;i++)
s[i]=stk.nextToken();
if(str[val].equalsIgnoreCase(s[0]))
{
if(val==1)
strng=str[0]+” “+lc+” “+s[2]+” R”; //formation of symbol table
lc+=Integer.parseInt(s[2]);
break;
}
}
mt.close();
op.write(inpt); //input to pass 2
op.newLine();
}
if(val==1)
{
sy.write(strng);
sy.newLine();
}
}
for(i=0;i<index;i++)
{
lt.write(litrl[i][0]+” “+litrl[i][1]+” “+litrl[i][2]+” “+litrl[i][3]);
lt.newLine();
}
inp.close();
sy.close();
lt.close();
op.close();
}
catch(FileNotFoundException ex)
{
System.out.println(“Unable to find file “);
}
catch(IOException e)
{
e.printStackTrace();
}
}
static void pass2()
{
int first=0,val=0,i,temp,mask;
String s,s0=””,str[],output,mot;
int value[]=new int[2];
index=0;
try
{
BufferedReader p1o = new BufferedReader(new FileReader(“pass1output.txt”));
File p2 = new File(“pass2output.txt”);
if (!p2.exists())
p2.createNewFile();
BufferedWriter op = new BufferedWriter(new FileWriter(p2.getAbsoluteFile()));
for(;(s=p1o.readLine())!=null;s0=str[val],val=0)
{
StringTokenizer st=new StringTokenizer(s);
str=new String[st.countTokens()];
for(i=0;i<str.length;i++)
str[i]=st.nextToken();
if(str.length==3)
val=1;
st=new StringTokenizer(str[val+1],”,”); //delimiter is comma
String lit[]=new String[st.countTokens()];
for(i=0;i<lit.length;i++)
lit[i]=st.nextToken();
if(str[val].equalsIgnoreCase(“USING”)) //dealing with pot
{
if(lit[0].equals(“*”))
{
if(first==0)
value[0]=0;
else
value[0]=getValue(s0,0); //0=symbol table & 1=literal table value
value[1]=Integer.parseInt(lit[1]);
first=1;
}
else
{
for(i=0;i<lit.length;i++)
{
value[i]=getValue(lit[i],0);
if(value[i]==-1)
value[i]=Integer.parseInt(lit[i]);
}
}
base_table[index][0]=value[1];
base_table[index++][1]=value[0];
}
else //dealing with mot
{
if(str[val].equalsIgnoreCase(“BNE”))
output=”BC “+7;
else
if(str[val].equalsIgnoreCase(“BR”))
output=”BCR “+15+”,”;
else
output=str[val]+” “;
BufferedReader mt = new BufferedReader(new FileReader(“mot.txt”));
while((mot=mt.readLine())!=null)
{
st=new StringTokenizer(mot);
String mts[]=new String[st.countTokens()];
for(i=0;i<mts.length;i++)
mts[i]=st.nextToken();
if(str[val].equals(mts[0]))
{
if(mts[3].equals(“RR”))
{
for(i=0;i<lit.length;i++)
{
if(i!=0)
output+=”,”;
temp=getValue(lit[i],0);
if(temp!=-1)
output+=temp;
else
output+=lit[i];
}
}
else
{
if(lit.length==1)
output+=offset(lit[0]);
else
{
temp=getValue(lit[0],0);
if(temp!=-1)
output+=temp;
else
output+=lit[0];
output+=offset(lit[1]);
}
}
break;
}
}
op.write(output);
op.newLine();
}
}
op.close();
}
catch(FileNotFoundException ex)
{
System.out.println(“Unable to find file “);
}
catch(IOException e)
{
e.printStackTrace();
}
}
static void ltorg(boolean flag)
{
int i,l=0;
if(flag)
{
l=lc+8;
lc=l-(l%8);
}
for(i=0;i<index;i++)
if(litrl[i][1].equals(“-1”))
{
litrl[i][1]=””+lc;
lc+=4;
}
}
static String offset(String s)
{
int value,indx,i,ind=0,offst,new_offst,indx_reg=0;
String string=s;
if(s.charAt(0)==’=’)
value=getValue(s.substring(1,s.length()),1); //0=symbol table & 1=literal table value
else
{
indx=s.indexOf(“(“);
if(indx!=-1)
{
s=s.substring(0,indx);
indx_reg=getValue(string.substring(string.indexOf(“(“)+1,string.indexOf(“)”)),0);
}
value=getValue(s,0);
}
offst=Math.abs(value – base_table[ind][1]);
for(i=1 ; i<index ; i++)
{
new_offst = Math.abs(value – base_table[i][1]);
if(new_offst < offst)
{
offst = new_offst;
ind = i;
}
}
String result = “,”+offst + “(” + indx_reg + “, ” + base_table[ind][0] + “)”;
return result;
}
static int getValue(String s,int flag)
{
try
{
String sym,file_name;
if(flag==0)
file_name=”symbol_table.txt”;
else
file_name=”literal_table.txt”;
BufferedReader br = new BufferedReader(new FileReader(file_name));
while((sym=br.readLine())!=null)
{
StringTokenizer st=new StringTokenizer(sym);
String str[]=new String[st.countTokens()];
for(int i=0;i<str.length;i++)
str[i]=st.nextToken();
if(str[0].equalsIgnoreCase(s))
return Integer.parseInt(str[1]);
}
}
catch(FileNotFoundException ex)
{
System.out.println(“Unable to find file “);
}
catch(IOException e)
{
e.printStackTrace();
}
return -1;
}
}
Input:
PRGAM2 START 0 USING *,15 LA 15,SETUP SR TOTAL,TOTAL AC EQU 2 INDEX EQU 3 TOTAL EQU 4 DATABASE EQU 13 SETUP EQU * USING SETUP,15 L DATABASE,=A(DATA1) USING DATAAREA,DATABASE SR INDEX,INDEX LOOP L AC,DATA1(INDEX) AR TOTAL,AC A AC,=F'5' ST AC,SAVE(INDEX) A INDEX,=F'4' C INDEX,=F'8000' BNE LOOP LR 1,TOTAL BR 14 LTORG SAVE DS 3F DATAAREA EQU * DATA1 DC F'25,26,27' END
MOT:
LA 01h 4 RX SR 02h 2 RR L 03h 4 RX AR 04h 2 RR A 05h 4 RX C 06h 4 RX BNE 07h 4 RX LR 08h 2 RR ST 09h 4 RX BR 15h 2 RR
OUTPUT:
Symbol Table:
PRGAM2 0 1 R AC 2 1 A INDEX 3 1 A TOTAL 4 1 A DATABASE 13 1 A SETUP 6 1 R LOOP 12 4 R SAVE 64 4 R DATAAREA 76 1 R DATA1 76 4 R
Literal Table:
A(DATA1) 48 4 R F'5' 52 4 R F'4' 56 4 R F'8000' 60 4 R
Pass 1 output(Pass 2 input):
USING *,15 LA 15,SETUP SR TOTAL,TOTAL USING SETUP,15 L DATABASE,=A(DATA1) USING DATAAREA,DATABASE SR INDEX,INDEX LOOP L AC,DATA1(INDEX) AR TOTAL,AC A AC,=F'5' ST AC,SAVE(INDEX) A INDEX,=F'4' C INDEX,=F'8000' BNE LOOP LR 1,TOTAL BR 14
Pass 2 output:
LA 15,6(0, 15) SR 4,4 L 13,42(0, 15) SR 3,3 L 2,0(3, 13) AR 4,2 A 2,24(0, 13) ST 2,12(3, 13) A 3,20(0, 13) C 3,16(0, 13) BC 7,6(0, 15) LR 1,4 BCR 15,14