Two pass Assembler

ShubhamShah001 112,788 views 20 slides Oct 09, 2014
Slide 1
Slide 1 of 20
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20

About This Presentation

Its an complete presentation of how two pass assembler works,two pass assembler program,comparison between one pass and two pass.


Slide Content

Walchand institute of technology, solapur Presenting a seminar on TWO PASS ASSEMBLERS

Two Pass Assembler Processing the source program into two passes . The internal tables and subroutines that are used only during Pass 1. The SYMTAB, LITTAB, and OPTAB are used by both passes. The main problems to assemble a program in one pass involves forward references. Pass 1 Forward references table String storage buffer Partially configured object file Assembly Language Pass 2 Machine Language

PASS 1 Assign addresses to all statements in the program. Addresses of symbolic labels are stored. Some assemble directives will be processed. PASS 2 Translate opcode and symbolic operands. Generate data values defined by BYTE,WORD etc. Assemble directives will be processed. Write the object program and assembly listing.

Data Structures Two major data structures: Operation Code Table (OPTAB): is used to look up mnemonic operation codes and translate them to their machine language equivalents Symbol Table (SYMTAB): is used to store values (addresses) assigned to labels Variable: Location Counter (LOCCTR) is used to help the assignment of addresses LOCCTR is initialized to the beginning address specified in the START statement The length of the assembled instruction or data area to be generated is added to LOCCTR

Algorithm for Pass 1 of Assembler(3/1) read first input line if OPCODE=‘START’ then begin save #[OPERAND] as starting address initialize LOCCTR to starting address write line to intermediate file read next input line end else initialize LOCCTR to 0 while OPCODE≠’END’ do begin if this is not a comment line then begin if there is a symbol in the LABEL field then

Algorithm for Pass 1 of Assembler(3/2) begin search SYMTAB for LABEL if found then set error flag (duplicate symbol) else insert (LABEL, LOCCTR) into SYMTAB end {if symbol} search OPTAB for OPCODE if found then add 3 {instruction length} to LOCCTR else if OPCODE=‘WORD’ then add 3 to LOCCTR else if OPCODE=‘RESW’ then add 3 * #[OPERAND] to LOCCTR

Algorithm for Pass 1 of Assembler(3/3) else if OPCODE=‘RESB’ then add #[OPERAND] to LOCCTR else if OPCODE=‘BYTE’ then begin find length of constant in bytes add length to LOCCTR end {if BYTE} else set error flag (invalid operation code) end {if not a comment} write line to intermediate file read next input line end {while not END} Write last line to intermediate file Save (LOCCTR-starting address) as program length

Algorithm for Pass 2 of Assembler(3/1) read first input line (from intermediate file) If OPCODE=‘START’ then begin write listing line read next input line end {if START} Write Header record to object program Initialize first Text record While OPCODE≠ ‘END’ do begin if this is not a comment line then begin search OPTAB for OPCODE if found then begin

Algorithm for Pass 2 of Assembler(3/2) if there is a symbol in OPERAND field then begin search SYMTAB for OPERAND if found then store symbol value as operand address else begin store 0 as operand address set error flag (undefined symbol) end end {if symbol} else store 0 as operand address assemble the object code instruction end {if opcode found}

Algorithm for Pass 2 of Assembler(3/3) else if OPCODE=‘BYTE’ or ‘WORD’ then convert constant to object code if object code will not fit into the current Text record then begin write Text record to object program initialize new Text record end add object code to Text record end {if not comment} write listing line read next input line end {while not END} write last Text record to object program Write End record to object program Write last listing line

#include< stdio.h > #include< string.h > #include< conio.h > void main() { char *code[9][4]={ {"PRG1","START","",""}, {"","USING","*","15"}, {"","L","",""}, {"","A","",""}, {"","ST","",""}, {"FOUR","DC","F",""}, {"FIVE","DC","F",""}, {"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; clrscr (); Program

printf ("----------------------------------------------------\n"); printf ("LABEL\t\ tOPCODE \n"); printf ("----------------------------------------------------\n\n"); for( i =0;i<=8;i++) { for(j=0;j<=3;j++) { printf ("%s\t\ t",code [ i ][j]); } j=0; printf ("\n"); } getch (); printf ("-----------------------------------------------------"); printf ("\ nVALUES FOR LC : \n\n "); for(j=0;j<=8;j++) { if (( strcmp (code[j][1],"START")!=0)&&( strcmp (code[j][1],"USING")!=0)&&( strcmp (code[j][1],"L")!=0)) lc [j]= lc [j-1]+4; printf ("%d\t", lc [j]); }

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 ("----------------------------------------------------"); printf ("\n\ nBASE TABLE:\n-------------------------------------------------------\n"); printf ("REG NO\t\ tAVAILIBILITY \ tCONTENTS OF BASE TABLE"); 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"); printf ("Continue..??"); getchar (); printf ("PASS2 TABLE:\n\n"); printf ("LABEL\t\tOP1\t\ tLC \t\t"); printf ("\n----------------------------------------------------\n"); loc =0; for( i =0;i<=8;i++) { for(j=0;j<=3;j++) { printf ("%s\t\ t",code [ i ][j]); } j=0; printf ("\n"); } printf ("-----------------------------------------------------"); getch (); }

---------------------------------------------------- LABEL OPCODE ---------------------------------------------------- PRG1 START USING * 15 L A ST FOUR DC F FIVE DC F TEMP DS 1F END ----------------------------------------------------- VALUES FOR LC : 0 0 0 4 8 12 16 20 24 OUTPUT

SYMBOL TABLE: ---------------------------------------------------- SYMBOL VALUE LENGTH R/A ---------------------------------------------------- PRG1 0 4 R FOUR 12 4 R FIVE 16 4 R TEMP 20 4 R ----------------------------------------------------

BASE TABLE: ------------------------------------------------------- REG NO AVAILIBILITY CONTENTS OF BASE TABLE ------------------------------------------------------- 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 N 15 Y

Continue..?? PASS2 TABLE: LABEL OP1 LC ---------------------------------------------------- PRG1 START USING * 15 L A ST FOUR DC F FIVE DC F TEMP DS 1F END -----------------------------------------------------

Any Queries ??? Thank You ……….