Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- INPUT FILE kk.txt
- macro ddd &a,&b,®=AREG
- lcl &m
- &m set 0
- mover ®,&a
- mend
- start
- MOVER AREG,='2'
- ddd 2,4
- end
- */
- #include<stdio.h>
- #include<conio.h>
- struct pntab{
- char var[15];
- }p1[20];
- struct evntab{
- char var[15];
- }e1[20];
- struct ssntab{
- char lb[15];
- }s1[20];
- struct mnt{
- char mname[20];
- int pp,kp,ev,mdtp,kpdtp,sstp;
- }m1[10];
- struct kptab{
- char var[15],val[15];
- }k1[20];
- struct sstab{
- int lbp;
- }ss1[20];
- struct mdt{
- char stmt[50];
- }mm1[50];
- struct aptab{
- char val[20];
- }a1[20];
- void main()
- {
- int kp=1,sp=1,mp=1,snp=1,pnp=1,evp=1,l=1,ap=1,i,j,k,nl,kl,me,cn,opt,e=0,en,mac,a,z,x,pr;
- char fn[15],str[30],str1[30],str2[50];
- FILE *f1,*f2;
- f1=NULL;
- printf("\n\nenter the source file name\n\n");
- scanf("%s",fn);
- f1=fopen(fn,"rb");
- while(f1==NULL)
- {
- printf("\n\nSuch file not exists\n\n");
- printf("\n\nEnter the valid file name\n\n");
- scanf("%s",fn);
- f1=fopen(fn,"rb");
- }
- while(e==0) //while eof
- {
- i=0;
- do
- {
- str[i]=fgetc(f1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"START")==NULL) //if start kw appears
- {e=1;
- break;}
- if(!strcmp(str,"macro")||!strcmp(str,"MACRO")) //if a macro kw
- {
- i=0;
- do
- {
- str[i]=fgetc(f1);
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- if(str[i]==EOF)
- {
- i++;
- e=1;
- break;
- } //name of macro
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- strcpy(m1[l].mname,str);
- nl=0;
- while(nl==0)
- {
- i=0;
- //nl=0;
- kl=0;
- do
- {
- // if(kl==0)
- str[i]=fgetc(f1);
- // else
- // str1[i]=fgetc(f1);
- if(str[i]=='\n'||str[i]=='\r') //parameters of macro
- {
- nl=1;
- i++;
- break;
- }
- if(str[i]==EOF) //updating mnt
- {
- i++;
- e=1;
- break;
- }
- if(str[i]=='=')
- {
- // str[i-1]='\0';
- i++;
- kl=1;
- break;
- }
- if(str[i]=='&')
- { i--;
- continue;
- }
- }while(str[i++]!=',');
- i--;
- str[i]='\0';
- if(kl==1)
- {
- i=0;
- do
- {
- // if(kl==0)
- // str[i]=fgetc(f1);
- // else
- str1[i]=fgetc(f1);
- if(str1[i]=='\n'||str1[i]=='\r') //parameters of macro
- {
- nl=1;
- i++;
- break;
- }
- if(str[i]==EOF) //updating mnt
- {
- i++;
- e=1;
- break;
- }
- }while(str[i++]!=',');
- i--;
- str1[i]='\0';
- }
- if(kl==0)
- {
- strcpy(p1[pnp++].var,str);
- m1[l].pp++;
- }
- m1[l].kpdtp=kp;
- if(kl==1)
- {
- strcpy(k1[kp].var,str);
- strcpy(k1[kp++].val,str1);
- strcpy(p1[pnp++].var,str);
- m1[l].kp++;
- }
- m1[l].mdtp=mp;
- m1[l].ev=0;
- m1[l].sstp=sp;
- } //while(nl==0)
- str[i]=fgetc(f1); //processing macro stmt
- me=1;
- i=0;
- do
- {
- str[i]=fgetc(f1); //processing macro stmt
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"mend")==0||strcmp(str,"MEND")==0)
- me=0;
- while(me==1)
- {
- i=0;
- do
- {
- str1[i]=fgetc(f1);
- if(str1[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]=='\n'||str1[i]=='\r')
- {
- i++;
- break;
- }
- }while(str1[i++]!=' ');
- i--;
- str1[i]='\0';
- if(strcmp(str,"LCL")==0||strcmp(str,"lcl")==0) //if lcl stmt
- {
- for (i=0;i<strlen(str);i++)
- str1[i]=str1[i+1];
- strcpy(e1[evp++].var,str1);
- m1[l].ev++;
- sprintf(str2,"LCL (E,%d)",evp);
- strcpy();
- }
- else if(strcmp(str1,"set")==0||strcmp(str1,"SET")==0) //if set stmt
- {
- for (i=0;i<strlen(str);i++)
- str[i]=str[i+1];
- for (i=1;i<evp;i++)
- {
- if(strcmp(e1[i].var,str)==0)
- break;
- }
- j=i;
- // str1[i]=fgetc(f1);
- i=0;
- do
- {
- str1[i]=fgetc(f1);
- if(str1[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]=='\n'||str1[i]=='\r')
- {
- i++;
- break;
- }
- }while(str1[i++]!=' ');
- i--;
- str1[i]='\0';
- sprintf(str2,"(E,%d) SET ",j);
- cn=1;
- opt=1;
- if(str1[0]=='&')
- while(opt==1)
- {
- k=0;
- for(;str1[cn]!='+'&&str1[cn]!='\n';cn++)
- {
- str[k]=str1[cn];
- k++;
- }
- if(str1[cn]=='+')
- opt=1;
- else
- opt=2;
- if(str[0]=='&')
- {
- for (i=0;i<strlen(str);i++)
- str[i]=str[i+1];
- for (i=1;i<evp;i++)
- {
- if(strcmp(e1[i].var,str)==0)
- break;
- }
- if(opt==1)
- sprintf(str,"(E,%d)+",i);
- if(opt==2)
- sprintf(str,"(E,%d)",i);
- strcat(str2,str);
- }
- else
- {
- i=atoi(str);
- if(opt==1)
- sprintf(str,"%d+",i);
- if(opt==2)
- sprintf(str,"%d",i);
- strcat(str2,str);
- }
- }
- else
- {
- strcat(str2,str1);
- }
- } //end of set processing
- else if(strcmp(str,"AIF")==0||strcmp(str,"aif")==0||strcmp(str,"AGO")==0||strcmp(str,"ago")==0)
- {
- } //aif or ago stmt
- else
- {
- sprintf(str2,"%s ",strupr(str));
- cn=1;
- while(opt==1)
- {
- for(i=0;str1[cn]!=','&&str1[cn]!='\0';i++,cn++)
- str[i]=str1[cn];
- if(str1[cn++]==',')
- opt=1;
- else
- opt=2;
- cn++;
- str[i]='\0';
- for(i=1;i<pnp;i++)
- if(strcmp(str,p1[i].var)==0)
- break;
- if(opt==1)
- sprintf(str,"(P,%d),",i);
- if(opt==2)
- sprintf(str,"(P,%d)",i);
- strcat(str2,str);
- }
- }
- strcpy(mm1[mp++].stmt,str2);
- str[i]=fgetc(f1); //processing macro stmt
- i=0;
- do
- {
- str[i]=fgetc(f1); //processing macro stmt
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"mend")==0||strcmp(str,"MEND")==0)
- {
- l++;
- me=0;
- }
- } //while(me==1)
- } //if macro stmt
- } //while(e=0)
- fclose(f1);
- f1=fopen(fn,"rb");
- while(strcmp(strupr(str),"START")!=0)
- {
- while(str[i]!='\n')
- str[i]=fgetc(f1);
- i=0;
- do
- {
- str[i]=fgetc(f1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- }
- f2=fopen("kkm.txt","w");
- i=0;
- str1[i]=fgetc(f1);
- if(str1[i++]==' ')
- {
- do
- {
- str1[i]=fgetc(f1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]=='\n'||str1[i]=='\r')
- {
- i++;
- break;
- }
- }while(str1[i++]!=' ');
- i--;
- str1[i]='\0';
- fprintf(f2,"%s %s\n",str,str1);
- }
- else
- fprintf(f2,"%s\n",str);
- e=0;
- en=0;
- while(e==0&&en==0)
- {
- mac=0;
- i=0;
- while(mac!=1&&e!=1)
- {
- /* while(str[i]!='\n'&&str1[0]!='\n')
- {
- str[i]=fgetc(f1);
- if(str[i]!='\r')
- fprintf(f2,"%c",str[i]);
- } */
- str1[0]='t';
- i=0;
- pr=0;
- do
- {
- str[i]=fgetc(f1);
- //if(str[i]!='\r')
- // fprintf(f2,"%c",str[i]);
- if(str[i]==EOF)
- { i++;
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- pr=1;
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- for(j=1;j<l;j++)
- if(strcmp(m1[j].mname,str)==0)
- {
- mac=1;
- goto zzz;
- }
- if(strcmp(strupr(str),"END")==0)
- {
- for(i=1;i<evp;i++)
- fprintf(f2,"%s DC 0\n",e1[i].var);
- fprintf(f2,"%s\n",str);
- if(e==1)
- {
- fclose(f2);
- fclose(f1);
- exit(0);
- }
- }
- if(pr==0)
- fprintf(f2,"%s ",str);
- else
- {
- fprintf(f2,"%s\n",str);
- str[i]=fgetc(f1);}
- }
- zzz: if(e==1)
- exit(0);
- // j--;
- i=0;
- do
- {
- str1[i]=fgetc(f1);
- if(str1[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]==',')
- {
- str1[i]='\0';
- if(str1[0]>='0'&&str1[0]<='9')
- {
- str1[i+3]='\0';
- str1[i+2]=39;
- for(x=i+1;x>1;x--)
- str1[x]=str1[x-2];
- str1[0]='=';
- str1[1]=39;
- }
- strcpy(a1[ap++].val,str1);
- i=0;
- continue;
- }
- else if(str1[i]=='\r')
- {
- str1[i]='\0';
- if(str1[0]>='0'&&str1[0]<='9')
- {
- str1[i+3]='\0';
- str1[i+2]=39;
- for(x=i+1;x>1;x--)
- str1[x]=str1[x-2];
- str1[0]='=';
- str1[1]=39;
- }
- strcpy(a1[ap++].val,str1);
- str1[i]=fgetc(f1);
- break;
- }
- i++;
- }while(str1[i]!='\n'&&str1[i]!='\r');
- if(ap<pnp)
- {
- for(i=1;i<kp;i++)
- strcpy(a1[ap++].val,k1[i].val);
- }
- if(j<l-1)
- k=m1[j+1].mdtp;
- else
- k=mp;
- for(a=m1[j].mdtp;a<k;a++)
- {
- i=0;
- z=0;
- while(mm1[a].stmt[z]!=' ')
- str[i++]=mm1[a].stmt[z++];
- str[i]='\0';
- z++;
- i=0;
- while(mm1[a].stmt[z]!='\0'&&mm1[a].stmt[z]!=' ')
- str1[i++]=mm1[a].stmt[z++];
- str1[i]='\0';
- if(mm1[a].stmt[z]=='\0')
- nl=0;
- else
- nl=1;
- if(strcmp(str,"LCL")==0) //if lcl stmt
- {
- continue;
- /* for(i=3;str[i]!=')';i++)
- str[i-3]=str[i];
- str[i-3]='\0';
- z=atoi(str);
- strcpy(str,e1[z].var);
- for (i=0;i<strlen(str);i++)
- str1[i]=str1[i+1];
- strcpy(e1[evp++].var,str1);
- m1[l].ev++;
- sprintf(str2,"LCL (E,%d)",evp);
- strcpy();*/
- }
- else if(strcmp(str1,"SET")==0) //if set stmt
- {
- for(i=3;str[i]!=')';i++)
- str[i-3]=str[i];
- str[i-3]='\0';
- i=atoi(str);
- strcpy(str,e1[i].var);
- i=0;
- z++;
- while(mm1[a].stmt[z]!='\0')
- str1[i++]=mm1[a].stmt[z++];
- str1[i]='\0';
- z=atoi(str1);
- fprintf(f2,"MOVER AREG,='%d'\nMOVEM AREG,%s\n",z,str);
- } //end of set processing
- // else if(strcmp(str,"AIF")==0||strcmp(str,"aif")==0||strcmp(str,"AGO")==0||strcmp(str,"ago")==0)
- // {
- // } //aif or ago stmt
- else
- {
- fprintf(f2,"%s ",strupr(str));
- i=0;
- while(str1[i]!='\0')
- {
- if(str1[i]=='('&&str1[i+1]=='E')
- {
- i+=3;
- k=0;
- while(str1[i]!=')')
- str[k++]=str1[i++];
- str[k]='\0';
- k=atoi(str);
- fprintf(f2,"%s",e1[k].var);
- i++;
- if(str1[i]==',')
- {
- fprintf(f2,",");
- i++;
- }
- if(str1[i]=='\0')
- fprintf(f2,"\n");
- }
- else if(str1[i]=='('&&str1[i+1]=='P')
- {
- i+=3;
- k=0;
- while(str1[i]!=')')
- str[k++]=str1[i++];
- str[k]='\0';
- k=atoi(str);
- fprintf(f2,"%s",a1[k].val);
- i++;
- if(str1[i]==',')
- {
- fprintf(f2,",");
- i++;
- }
- if(str1[i]=='\0')
- fprintf(f2,"\n");
- }
- else
- {
- k=0;
- while(str1[i]!='\0'||str1[i]!=',')
- str[k++]=str1[i++];
- str[k]='\0';
- fprintf(f2,"%s",strupr(str));
- if(str1[i]==',')
- {
- fprintf(f2,",");
- i++;
- }
- if(str1[i]=='\0')
- fprintf(f2,"\n");
- }
- }
- }
- } //macro expansion for(a=m1[j].mdtp;a<k;a++)
- } //while(e==0||en==0)
- }
- //main
- //@h@ CODE OF ASSEMBLER PASS 1
- #include<stdio.h>
- #include<stdlib.h>
- #include<conio.h>
- #include<string.h>
- #include<fstream.h>
- struct code
- {
- char label[10],opcode[10],operand1[10],operand2[10];
- }code1[30];
- struct iccode
- {
- int add,opcodevalue,operand1code,operand2value;
- char opcodeclass[3],operand2class;
- }iccode1[30];
- struct symtab
- {
- int sno,addr,len;
- char sym[10];
- }symtab1[30];
- struct littab
- {
- int littab_ptr,lit_add;
- char lit[10];
- }littab1[30];
- int opcodeimpck(char a[])
- {
- int i;
- if(strcmp(a,"STOP")==0)
- return(0);
- if(strcmp(a,"ADD")==0)
- return(1);
- if(strcmp(a,"SUB")==0)
- return(2);
- if(strcmp(a,"MUL")==0)
- return(3);
- if(strcmp(a,"MOVER")==0)
- return(4);
- if(strcmp(a,"MOVEM")==0)
- return(5);
- if(strcmp(a,"COMP")==0)
- return(6);
- if(strcmp(a,"BC")==0)
- return(7);
- if(strcmp(a,"DIV")==0)
- return(8);
- if(strcmp(a,"READ")==0)
- return(9);
- if(strcmp(a,"PRINT")==0)
- return(10);
- return(-1);
- }
- int opcodeassck(char a[])
- {
- int i;
- if(strcmp(a,"START")==0)
- return(1);
- if(strcmp(a,"END")==0)
- return(2);
- if(strcmp(a,"ORIGIN")==0)
- return(3);
- if(strcmp(a,"EQU")==0)
- return(4);
- if(strcmp(a,"LTORG")==0)
- return(5);
- return(-1);
- }
- int opcodedecck(char a[])
- {
- if(strcmp(a,"DC")==0)
- return(1);
- if(strcmp(a,"DS")==0)
- return(2);
- return(-1);
- }
- int oprnd1(char a[])
- {
- if(strcmp(a,"AREG")==0)
- return(1);
- if(strcmp(a,"BREG")==0)
- return(2);
- if(strcmp(a,"CREG")==0)
- return(3);
- if(strcmp(a,"DREG")==0)
- return(4);
- return(-1);
- }
- void main()
- {
- int loc_cntr=0,pooltab_ptr=1,pooltab[10],littab_ptr=0,symtab_ptr=0;
- int i,j,k,rt,ln,op,opr,e,err;
- char str[15];
- FILE *fp1,*fp2,*fp3;
- clrscr();
- fp1=fopen("KKM.txt","r");
- if(fp1==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- ln=0;
- op=0;
- e=0;
- pooltab[0]=1;
- i=0;
- rt=1;
- //check for "start" keyword
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n')
- {
- rt=0;
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"START")==0)
- {
- if(rt==1)
- { i=0;
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- }while(str[i++]!='\n');
- i--;
- str[i]='\0';
- loc_cntr=atoi(str);
- }
- }
- else
- {
- printf("\nError:prog should begin with START\n");
- exit(0);
- }
- if(rt==0)
- loc_cntr=0;
- //pass1
- do{
- iccode1[ln].add=loc_cntr;
- err=0;
- do{
- i=0;
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]=='\n')
- {
- i++;
- break;
- }
- if(str[i]==EOF)
- {
- i++;
- e=1;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- rt=opcodeimpck(str); //check for imperative stmt
- if(rt==-1)
- {
- rt=opcodeassck(str); //check for assembler directive
- if(rt==-1)
- {
- rt=opcodedecck(str); //check for declarative stmt
- if(rt==-1)
- {
- if(err==1) //if second word is not any keyword
- {
- printf("\nError at line %d\n",ln+2);
- printf("%s ",code1[ln].label);
- do
- {
- str[i]=fgetc(fp1);
- printf("%c",str[i]);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- }while(str[i++]!='\n');
- getch();
- exit(0);
- }
- strcpy(code1[ln].label,str);
- j=0;
- err=1; //set label has been read
- for(i=0;i<symtab_ptr;i++)
- if(strcmp(symtab1[i].sym,str)==0) //check if label is present in table
- j=1;
- if(j==0) //if not copy in table
- {
- symtab1[symtab_ptr].addr=loc_cntr;
- symtab1[symtab_ptr].len=1;
- strcpy(symtab1[symtab_ptr].sym,str);
- symtab_ptr++;
- }
- op=0;
- }
- else
- {
- op=3;
- strcpy(code1[ln].opcode,str);
- strcpy(iccode1[ln].opcodeclass,"DL");
- iccode1[ln].opcodevalue=rt;
- }
- }
- else
- {
- op=2;
- strcpy(code1[ln].opcode,str);
- strcpy(iccode1[ln].opcodeclass,"AD");
- iccode1[ln].opcodevalue=rt;
- }
- }
- else
- {
- strcpy(code1[ln].opcode,str);
- strcpy(iccode1[ln].opcodeclass,"IS");
- iccode1[ln].opcodevalue=rt;
- op=1;
- }
- }while(op==0&&e==0);
- if(op==1&&e==0) //imperative stmt
- { i=0;
- do //Read register
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- }while(str[i++]!=',');
- i--;
- str[i]='\0';
- opr=oprnd1(str);
- if(opr==-1) //error if not a register
- {
- printf("\nError at line %d\n",ln+2);
- printf("%s %s ",code1[ln].label,code1[ln].opcode);
- do
- {
- str[i]=fgetc(fp1);
- printf("%c",str[i]);
- }while(str[i]==EOF||str[i++]!='\n');
- getch();
- exit(0);
- }
- strcpy(code1[ln].operand1,str);
- iccode1[ln].operand1code=opr;
- i=0; //read operand 2
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- i++;
- break;
- }
- }while(str[i++]!='\n'&&e==0);
- i--;
- str[i]='\0';
- strcpy(code1[ln].operand2,str);
- if(str[0]=='=') //operand 2 is literal
- {
- iccode1[ln].operand2class='L';
- j=0;
- for(i=pooltab[pooltab_ptr-1];i<littab_ptr;i++)
- if(strcmp(littab1[i].lit,str)==0)
- {
- iccode1[ln].operand2value=i+1;
- j=1;
- }
- if(j==0)
- {
- iccode1[ln].operand2value=littab_ptr+1;
- strcpy(littab1[littab_ptr].lit,str);
- littab_ptr++;
- }
- }
- else //operand 2 is symbol
- {
- iccode1[ln].operand2class='S';
- j=0;
- for(i=0;i<symtab_ptr;i++)
- if(strcmp(symtab1[i].sym,str)==0)
- {
- iccode1[ln].operand2value=i+1;
- j=1;
- }
- if(j==0)
- {
- iccode1[ln].operand2value=symtab_ptr+1;
- strcpy(symtab1[symtab_ptr].sym,str);
- symtab_ptr++;
- }
- }
- }
- if((op==2&&e==0)||(op==2&&rt==2)) //assembler directive
- {
- i=0;
- if(rt==3) //origin stmt
- {
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- }while(str[i++]!='\n'&&e==0);
- if(i!=0)
- loc_cntr=atoi(str);
- }
- if(rt==5||rt==2) //ltorg or end stmt
- {
- for(i=pooltab[pooltab_ptr-1]-1;i<littab_ptr;i++)
- {
- littab1[i].lit_add=loc_cntr;
- iccode1[ln].add=loc_cntr;
- strcpy(iccode1[ln].opcodeclass,"AD");
- iccode1[ln].opcodevalue=rt;
- iccode1[ln].operand2class='-';
- str[0]=littab1[i].lit[2];
- str[1]='\0';
- iccode1[ln].operand2value=atoi(str);
- ln++;
- loc_cntr++;
- }
- if(rt==5)
- {pooltab[pooltab_ptr++]=littab_ptr+1;
- goto ltorg;}
- else
- goto end;
- }
- }
- if(op==3&&e==0) //declarative stmt
- {
- if(rt==1) //DC
- {
- j=0;
- for(i=0;i<symtab_ptr;i++)
- if(strcmp(symtab1[i].sym,code1[ln].label)==0)
- {
- j=1;
- break;
- }
- if(j==0)
- i=symtab_ptr;
- symtab1[i].addr=loc_cntr;
- symtab1[i].len=1;
- strcpy(symtab1[i].sym,code1[ln].label);
- i=0;
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- i++;
- break;
- }
- }while(str[i++]!='\n'&&e==0);
- i--;
- str[i]='\0';
- iccode1[ln].operand2class='C';
- iccode1[ln].operand2value=atoi(str);
- loc_cntr++;
- ln++;
- goto ltorg;
- }
- if(rt==2) //DS
- {
- j=0;
- for(i=0;i<symtab_ptr;i++)
- if(strcmp(symtab1[i].sym,code1[ln].label)==0)
- {
- j=1;
- break;
- }
- if(j==0)
- i=symtab_ptr;
- symtab1[i].addr=loc_cntr;
- strcpy(symtab1[i].sym,code1[ln].label);
- j=i;
- i=0;
- do
- {
- str[i]=fgetc(fp1);
- if(str[i]==EOF)
- {
- e=1;
- i++;
- break;
- }
- }while(str[i++]!='\n'&&e==0);
- i--;
- str[i]='\0';
- iccode1[ln].operand2class='C';
- iccode1[ln].operand2value=atoi(str);
- symtab1[j].len=atoi(str);
- loc_cntr=loc_cntr+atoi(str);
- ln=ln+atoi(str);
- goto ltorg;
- }
- }
- loc_cntr++;
- ln++;
- ltorg:
- }while(e==0);
- end:
- /*
- if(strcmp(code1[ln-1].opcode,"END")!=0||strcmp(code1[ln-1].opcode,"end")!=0)
- {
- printf("\nno end stmt\n");
- exit(0);
- } */
- printf("\nPASS 1:-\n\nlabel opcode operand1 operand2\n");
- fclose(fp1);
- fp1=fopen("pass1.txt","w");
- if(fp1==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- printf("\n%-6s %-7s %-9s %-15s",code1[i].label,code1[0].opcode,code1[0].operand1,code1[0].operand2);
- printf("%d (%s,%d) %d (%c,%d)",iccode1[0].add,iccode1[0].opcodeclass,iccode1[0].opcodevalue,iccode1[0].operand1code,iccode1[0].operand2class,iccode1[0].operand2value);
- fprintf(fp1,"%d %s %d %d %c %d\n",iccode1[0].add,iccode1[0].opcodeclass,iccode1[0].opcodevalue,iccode1[0].operand1code,iccode1[0].operand2class,iccode1[0].operand2value);
- for(i=0;i<ln;i++)
- {
- if(iccode1[i].add!=NULL)
- {
- printf("\n%-6s %-7s %-9s %-15s",code1[i].label,code1[i].opcode,code1[i].operand1,code1[i].operand2);
- printf("%d (%s,%d) %d (%c,%d)",iccode1[i].add,iccode1[i].opcodeclass,iccode1[i].opcodevalue,iccode1[i].operand1code,iccode1[i].operand2class,iccode1[i].operand2value);
- if(i<ln-1)
- fprintf(fp1,"%d %s %d %d %c %d\n",iccode1[i].add,iccode1[i].opcodeclass,iccode1[i].opcodevalue,iccode1[i].operand1code,iccode1[i].operand2class,iccode1[i].operand2value);
- else
- fprintf(fp1,"%d %s %d %d %c %d",iccode1[i].add,iccode1[i].opcodeclass,iccode1[i].opcodevalue,iccode1[i].operand1code,iccode1[i].operand2class,iccode1[i].operand2value);
- }
- }
- fclose(fp1);
- fp1=fopen("symtab.txt","w");
- if(fp1==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- fp2=fopen("littab.txt","w");
- if(fp2==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- fp3=fopen("pooltab.txt","w");
- if(fp3==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- printf("\n\n\nS.No. Symbol Address Length Lit_no Literal Address Pool table");
- for (i=0;i<symtab_ptr||i<littab_ptr||i<pooltab_ptr;i++)
- {
- if(i<symtab_ptr)
- {printf("\n%-5d %-10s %-5d %-15d",i+1,symtab1[i].sym,symtab1[i].addr,symtab1[i].len);
- fprintf(fp1,"%d %s %d %d\n",i+1,symtab1[i].sym,symtab1[i].addr,symtab1[i].len);}
- if(i<littab_ptr)
- {printf("%-5d %-7s %-15d",i+1,littab1[i].lit,littab1[i].lit_add);
- fprintf(fp2,"%d %s %d\n",i+1,littab1[i].lit,littab1[i].lit_add);}
- if(i<pooltab_ptr)
- {printf("%d",pooltab[i]);
- fprintf(fp3,"%d\n",pooltab[i]);}
- }
- fclose(fp1);
- fclose(fp2);
- fclose(fp3);
- getch();
- }
- //PASS 2
- #include<stdio.h>
- #include<stdlib.h>
- #include<conio.h>
- #include<string.h>
- #include<fstream.h>
- struct iccode2
- {
- int add,op,op1,op2;
- }ic[30];
- void main()
- {
- int ad,opc,op1,opr2,ln,ptr,addr,lth,i;
- char op[3],op2,lbl[10];
- FILE *fp1,*fp2,*fp3,*fp4;
- clrscr();
- fp1=fopen("pass1.txt","r");
- if(fp1==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- fp2=fopen("symtab.txt","r");
- if(fp2==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- fp3=fopen("littab.txt","r");
- if(fp3==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- fp4=fopen("pooltab.txt","r");
- if(fp4==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- /*
- fp1=fopen("pass1.txt","r");
- if(fp1==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- int l;
- char a[10],c;
- while(fscanf(fp1,"%d %s %d %d %c %d",&i,a,&j,&k,&c,&l)!=EOF)
- {
- printf("\n%d (%s,%d) %d (%c,%d)",i,a,j,k,c,l);
- }
- fclose(fp1);
- */
- ln=0;
- while(fscanf(fp1,"%d %s %d %d %c %d",&ad,op,&opc,&op1,&op2,&opr2)!=EOF)
- {
- ic[ln].add=ad;
- if(strcmp(op,"IS")==0)
- ic[ln].op=opc;
- else
- ic[ln].op=0;
- ic[ln].op1=op1;
- if(op2=='S')
- {
- fseek(fp2,0,SEEK_SET);
- while(fscanf(fp2,"%d %s %d %d",&ptr,lbl,&addr,<h)!=EOF)
- {
- if(opr2==ptr)
- {
- ic[ln].op2=addr;
- break;
- }
- }
- }
- else if(op2=='L')
- {
- fseek(fp3,0,SEEK_SET);
- while(fscanf(fp3,"%d %s %d",&ptr,lbl,&addr)!=EOF)
- {
- if(opr2==ptr)
- {
- ic[ln].op2=addr;
- break;
- }
- }
- }
- else
- ic[ln].op2=opr2;
- ln++;
- }
- fclose(fp1);
- fclose(fp2);
- fclose(fp3);
- fclose(fp4);
- printf("\nPASS 2:-\n\naddress opcode operand1 operand2\n");
- fp1=fopen("pass2.txt","w");
- if(fp1==NULL)
- {
- printf("\ncann't open file\n");
- exit(0);
- }
- for(i=0;i<ln;i++)
- {
- printf("\n%-9d %-8d %-10d %-10d",ic[i].add,ic[i].op,ic[i].op1,ic[i].op2);
- fprintf(fp1,"%d %d %d %d\n",ic[i].add,ic[i].op,ic[i].op1,ic[i].op2);
- }
- //fclose(fp1);
- getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement