#include <stdio.h>
#include <stdlib.h>
FILE *fmapping;
FILE *ftmp;
void convert_internal_representation(int ts1,int ts2,int ts3,int ts4,int ts5,int ts6,int prev)
{
if(fmapping==NULL)
printf("Error\n");
int addr=0;
fmapping=fopen("mem_mapp.txt","a+");
addr=prev+ts1;
fprintf(fmapping,"%04x %06x\n",addr,ts2);
fprintf(fmapping,"%04x %06x\n",addr+3,ts3);
fprintf(fmapping,"%04x %06x\n",addr+6,ts4);
fprintf(fmapping,"%04x %06x\n",addr+9,ts5);
fprintf(fmapping,"%04x %06x\n",addr+12,ts6);
fprintf(fmapping,"\n\n");
fclose(fmapping);
}
void table(int length)
{
int prev_header=0;
char hs1[10];
int hstart_addr,hend_addr;
char ds1[10],ds2[10];
int dstart_addr,dend_addr;
char rs1[10],rs2[10],rs3[10],rs4[10];
char ms1[10],ms2[10],ms3[10];
int ts1,ts2,ts3,ts4,ts5,ts6;
char es1[10];
char ch;
FILE *fin=fopen("linking_input.txt","r");
fmapping=fopen("mem_mapp.txt","w+");
FILE *fout=fopen("estab.txt","w");
if(fin==NULL||fout==NULL)
{
printf("Error\n");
exit(1);
}
fscanf(fin,"%c",&ch);
while(!feof(fin))
{
if(ch=='H')
{
fscanf(fin,"%s %x %x",hs1,&hstart_addr,&hend_addr);
fprintf(fout,"\n%s %0.4x %0.4x\n",hs1,hstart_addr+length,hend_addr);
prev_header+=hstart_addr+length;
}
else if(ch=='D')
{
fscanf(fin,"%s %x %s %x",ds1,&dstart_addr,ds2,&dend_addr);
fprintf(fout,"\n\t%s %0.4x %s %0.4x\n",ds1,dstart_addr+length,ds2,dend_addr+length);
length+=hend_addr;
}
else if(ch=='R')
{
fscanf(fin,"%s %s %s %s",rs1,rs2,rs3,rs4);
}
else if(ch=='T')
{
fscanf(fin,"%x %x %x %x %x %x ",&ts1,&ts2,&ts3,&ts4,&ts5,&ts6);
convert_internal_representation(ts1,ts2,ts3,ts4,ts5,ts6,prev_header);
}
else if(ch=='M')
{
fscanf(fin,"%s %s %s",ms1,ms2,ms3);
}
else if(ch=='E')
{
fscanf(fin,"%s",es1);
prev_header=0;
}
if(ch=='$')
{
fclose(fin);
fclose(fout);
return;
}
fscanf(fin,"%c",&ch);
}
fclose(fin);
fclose(fout);
}
int main()
{
int addr=0x4000;
table(addr);
return 0;
}
loader 1:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char s1[10],s2[10];int start_addr,end_addr;
}header;
typedef struct
{
char s1[10],s2[10];int start_addr,end_addr;//s3[10];
}defn;
typedef struct
{
char s1[10],s2[10],s3[10],s4[10];
}reference;
typedef struct
{
char s1[10],s2[10],s3[10],s4[10];
}modification;
typedef struct
{
char s1[10],s2[10],s3[10],s4[10],s5[10],s6[10];
}text;
typedef struct
{
char s1[10];
}end;
void generate_external_symbol_table(int length)
{
text t;
reference r;
defn d;
header h;
modification m;
end e;
//int end_length=0;
char ch;
// FILE *fin=fopen("linking_input.txt","r");
FILE *fin=fopen("input.txt","r");
FILE *fout=fopen("External Symbol Table .txt","w");
if(fin==NULL||fout==NULL)
{
printf("Error in opening Files\n");
exit(1);
}
fscanf(fin,"%c",&ch);
printf("\n\tSTARTING ADDRESS: %0.4x\n\n",length);
printf("\n\n********* External Symbol Table Generated **************\n");
while(!feof(fin))
{
if(ch=='H')
{
// fprintf(fout,"%c ",ch);
fscanf(fin,"%s %x %x",h.s1,&h.start_addr,&h.end_addr);
printf("\n%s %0.4x %0.4x\n",h.s1,h.start_addr+length,h.end_addr);///////
fprintf(fout,"\n%s %0.4x %0.4x\n",h.s1,h.start_addr+length,h.end_addr);///////
// end_length=length+h.end_addr;
}
else if(ch=='D')
{
// fprintf(fout,"%c ",ch);
fscanf(fin,"%s %x %s %x",d.s1,&d.start_addr,d.s2,&d.end_addr);
fprintf(fout,"\n\t%s %0.4x %s %0.4x\n",d.s1,d.start_addr+length,d.s2,d.end_addr+length);
printf("\n\t%s %0.4x %s %0.4x\n",d.s1,d.start_addr+length,d.s2,d.end_addr+length);////
length+=h.end_addr;
}
else if(ch=='R')
{
fscanf(fin,"%s %s %s %s",r.s1,r.s2,r.s3,r.s4);
}
else if(ch=='T')
{
fscanf(fin,"%s %s %s %s %s %s ",t.s1,t.s2,t.s3,t.s4,t.s5,t.s6);
}
else if(ch=='M')
{
fscanf(fin,"%s %s %s",m.s1,m.s2,m.s3);
}
else if(ch=='E')
{
fscanf(fin,"%s",e.s1);
}
if(ch=='$')
{
printf("\n*********************************************************\n\n");
fprintf(fout,"\n\n\t\tExternal Symbol Table Generated\n");
fclose(fin);
fclose(fout);
return;
}
fscanf(fin,"%c",&ch);
}
printf("\n********************************************************\n\n");
fprintf(fout,"\n\n\t\tExternal Symbol Table Generated\n");
fclose(fin);
fclose(fout);
}
int main()
{
int addr;
printf("\nEnter the Starting Address of Linking Loader in HEX\n");
scanf("%x",&addr);
generate_external_symbol_table(addr);
return 0;
}
#include <stdlib.h>
FILE *fmapping;
FILE *ftmp;
void convert_internal_representation(int ts1,int ts2,int ts3,int ts4,int ts5,int ts6,int prev)
{
if(fmapping==NULL)
printf("Error\n");
int addr=0;
fmapping=fopen("mem_mapp.txt","a+");
addr=prev+ts1;
fprintf(fmapping,"%04x %06x\n",addr,ts2);
fprintf(fmapping,"%04x %06x\n",addr+3,ts3);
fprintf(fmapping,"%04x %06x\n",addr+6,ts4);
fprintf(fmapping,"%04x %06x\n",addr+9,ts5);
fprintf(fmapping,"%04x %06x\n",addr+12,ts6);
fprintf(fmapping,"\n\n");
fclose(fmapping);
}
void table(int length)
{
int prev_header=0;
char hs1[10];
int hstart_addr,hend_addr;
char ds1[10],ds2[10];
int dstart_addr,dend_addr;
char rs1[10],rs2[10],rs3[10],rs4[10];
char ms1[10],ms2[10],ms3[10];
int ts1,ts2,ts3,ts4,ts5,ts6;
char es1[10];
char ch;
FILE *fin=fopen("linking_input.txt","r");
fmapping=fopen("mem_mapp.txt","w+");
FILE *fout=fopen("estab.txt","w");
if(fin==NULL||fout==NULL)
{
printf("Error\n");
exit(1);
}
fscanf(fin,"%c",&ch);
while(!feof(fin))
{
if(ch=='H')
{
fscanf(fin,"%s %x %x",hs1,&hstart_addr,&hend_addr);
fprintf(fout,"\n%s %0.4x %0.4x\n",hs1,hstart_addr+length,hend_addr);
prev_header+=hstart_addr+length;
}
else if(ch=='D')
{
fscanf(fin,"%s %x %s %x",ds1,&dstart_addr,ds2,&dend_addr);
fprintf(fout,"\n\t%s %0.4x %s %0.4x\n",ds1,dstart_addr+length,ds2,dend_addr+length);
length+=hend_addr;
}
else if(ch=='R')
{
fscanf(fin,"%s %s %s %s",rs1,rs2,rs3,rs4);
}
else if(ch=='T')
{
fscanf(fin,"%x %x %x %x %x %x ",&ts1,&ts2,&ts3,&ts4,&ts5,&ts6);
convert_internal_representation(ts1,ts2,ts3,ts4,ts5,ts6,prev_header);
}
else if(ch=='M')
{
fscanf(fin,"%s %s %s",ms1,ms2,ms3);
}
else if(ch=='E')
{
fscanf(fin,"%s",es1);
prev_header=0;
}
if(ch=='$')
{
fclose(fin);
fclose(fout);
return;
}
fscanf(fin,"%c",&ch);
}
fclose(fin);
fclose(fout);
}
int main()
{
int addr=0x4000;
table(addr);
return 0;
}
loader 1:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char s1[10],s2[10];int start_addr,end_addr;
}header;
typedef struct
{
char s1[10],s2[10];int start_addr,end_addr;//s3[10];
}defn;
typedef struct
{
char s1[10],s2[10],s3[10],s4[10];
}reference;
typedef struct
{
char s1[10],s2[10],s3[10],s4[10];
}modification;
typedef struct
{
char s1[10],s2[10],s3[10],s4[10],s5[10],s6[10];
}text;
typedef struct
{
char s1[10];
}end;
void generate_external_symbol_table(int length)
{
text t;
reference r;
defn d;
header h;
modification m;
end e;
//int end_length=0;
char ch;
// FILE *fin=fopen("linking_input.txt","r");
FILE *fin=fopen("input.txt","r");
FILE *fout=fopen("External Symbol Table .txt","w");
if(fin==NULL||fout==NULL)
{
printf("Error in opening Files\n");
exit(1);
}
fscanf(fin,"%c",&ch);
printf("\n\tSTARTING ADDRESS: %0.4x\n\n",length);
printf("\n\n********* External Symbol Table Generated **************\n");
while(!feof(fin))
{
if(ch=='H')
{
// fprintf(fout,"%c ",ch);
fscanf(fin,"%s %x %x",h.s1,&h.start_addr,&h.end_addr);
printf("\n%s %0.4x %0.4x\n",h.s1,h.start_addr+length,h.end_addr);///////
fprintf(fout,"\n%s %0.4x %0.4x\n",h.s1,h.start_addr+length,h.end_addr);///////
// end_length=length+h.end_addr;
}
else if(ch=='D')
{
// fprintf(fout,"%c ",ch);
fscanf(fin,"%s %x %s %x",d.s1,&d.start_addr,d.s2,&d.end_addr);
fprintf(fout,"\n\t%s %0.4x %s %0.4x\n",d.s1,d.start_addr+length,d.s2,d.end_addr+length);
printf("\n\t%s %0.4x %s %0.4x\n",d.s1,d.start_addr+length,d.s2,d.end_addr+length);////
length+=h.end_addr;
}
else if(ch=='R')
{
fscanf(fin,"%s %s %s %s",r.s1,r.s2,r.s3,r.s4);
}
else if(ch=='T')
{
fscanf(fin,"%s %s %s %s %s %s ",t.s1,t.s2,t.s3,t.s4,t.s5,t.s6);
}
else if(ch=='M')
{
fscanf(fin,"%s %s %s",m.s1,m.s2,m.s3);
}
else if(ch=='E')
{
fscanf(fin,"%s",e.s1);
}
if(ch=='$')
{
printf("\n*********************************************************\n\n");
fprintf(fout,"\n\n\t\tExternal Symbol Table Generated\n");
fclose(fin);
fclose(fout);
return;
}
fscanf(fin,"%c",&ch);
}
printf("\n********************************************************\n\n");
fprintf(fout,"\n\n\t\tExternal Symbol Table Generated\n");
fclose(fin);
fclose(fout);
}
int main()
{
int addr;
printf("\nEnter the Starting Address of Linking Loader in HEX\n");
scanf("%x",&addr);
generate_external_symbol_table(addr);
return 0;
}
No comments:
Post a Comment