Friday, May 08, 2015

loader 2

#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;
}

 

No comments:

Post a Comment