URDINESH: Assembly Language programming in C
Showing posts with label Assembly Language programming in C. Show all posts
Showing posts with label Assembly Language programming in C. Show all posts

Wednesday, May 7, 2014

IMPLEMENTATION OF A MACRO PROCESSOR

IMPLEMENTATION OF A MACRO PROCESSOR

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
            char n,n1,c1,i,oper[20],opd[20],iopd[20],ilab[20];
            char fn[10][10],m[20][3];
            FILE *fp1,*fp2,*p[5];
            clrscr();
            printf("\nImplementation of A Macro Processor:");
            printf("\n------------------------------------\n\n");
            n=0;
            fp1=fopen("macin.txt","r");
            while(!feof(fp1))
            {
              fscanf(fp1,"%s%s%s",ilab,iopd,oper);
              if(strcmp(iopd,"macro")==0)
              n++;
            }
            printf("No.Of.Macros = %d\n",n);
            n1=n;
            printf("Enter the text filename: ");
            for(i=0;i<n;i++)
            {
              scanf("%s",fn[i]);
              p[i]=fopen(fn[i],"w");
            }
            n=0;
            rewind(fp1);
            while(!feof(fp1))
            {
              fscanf(fp1,"%s%s%s",ilab,iopd,oper);
              if(strcmp(iopd,"macro")==0)
              {
                strcpy(m[n],oper);
                fscanf(fp1,"%s%s%s",ilab,iopd,oper);
                while(strcmp(iopd,"mend")!=0)
                {
                  fprintf(p[n],"%s %s %s\n",ilab,iopd,oper);
                  fscanf(fp1,"%s%s%s",ilab,iopd,oper);
                }
                fclose(p[n]);
                n++;
              }
            }
            for(i=0;i<n1;i++)
              p[i]=fopen(fn[i],"r");
            fp2=fopen("macout.txt","w");
            rewind(fp1);
            fscanf(fp1,"%s%s%s",ilab,iopd,oper);
            while(!feof(fp1))
            {
              if(strcmp(iopd,"call")==0)
              {
                for(i=0;i<n1;i++)
                {
                  if(strcmp(m[i],oper)==0)
                  {
                        rewind(p[i]);
                        fscanf(p[i],"%s%s%s",ilab,iopd,oper);
                        while(!feof(p[i]))
                        {
                          fprintf(fp2,"%s %s %s\n",ilab,iopd,oper);
                          c1=1;
                          fscanf(p[i],"%s%s%s",ilab,iopd,oper);
                        }
                        break;
                  }
                }
              }
              if(c1!=1)
                fprintf(fp2,"%s %s %s\n",ilab,iopd,oper);
              c1=0;
              fscanf(fp1,"%s%s%s",ilab,iopd,oper);
            }
            fprintf(fp2,"%s %s %s\n",ilab,iopd,oper);
            printf("\nProgram Completed Successfully...");
            getch();
}






OUTPUT:


Implementation of A Macro Processor:
------------------------------------------------

No.Of.Macros = 2
Enter the text filename: macin
macout

Program Completed Successfully...



INPUT FILE:


MACIN.TXT


**        macro     m1
**        move      a,b
**        mend      --
**        macro                 m2
**        lda          b
**        mend      --
**        start       1000
**        lda         a
**        call         m1
**        call         m2
**        add        a,b











OUTPUT FILE:


MACOUT.TXT


**      macro      m1
**      move       a,b
**      mend       --
**      macro      m2
**      lda           b
**      mend       --
**      start        1000
**      lda          a
**      move      a,b
**      lda          b

**      add         a,b

IMPLEMENTATION OF PASS OF A DIRECT LINKING LOADER

IMPLEMENTATION OF PASS OF A DIRECT LINKING LOADER

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 10
struct estab
{
   char csect[10],sym_name[10];
   long int add;
   int length;
}table[MAX];
void main()
{
   FILE *fp1,*fp2;
   char in[10];
   long int i,count=0,start,len,loc;
   clrscr();
   printf("\nImplementation Of Pass1 Of A Direct Linking Loader:");
   printf("\n---------------------------------------------------\n\n");
   fp1=fopen("link1in.txt","r");
   fp2=fopen("link1out.txt","w");
   printf("Enter the Location where the program has to be loaded: ");
   scanf("%lx",&start);
   fprintf(fp2,"CSECT\tSYM_NAME\tADDRESS\tLENGTH\n");
   rewind(fp1);
   while(!feof(fp1))
   {
     fscanf(fp1,"%s",in);
     if(strcmp(in,"H")==0)
     {
       fscanf(fp1,"%s",in);
       strcpy(table[count].csect,in);
       strcpy(table[count].sym_name,"\0");
       fscanf(fp1,"%s",in);
       table[count].add=atoi(in)+start;
       fscanf(fp1,"%s",in);
       len=atoi(in);
       table[count++].length=atoi(in);
       fscanf(fp1,"%s",in);
     }
     if(strcmp(in,"D")==0)
     {
       fscanf(fp1,"%s%lx",in,&loc);
       while(strcmp(in,"R")!=0)
       {
             strcpy(table[count].csect,"\0");
             strcpy(table[count].sym_name,in);
             table[count].add=loc+start;
             table[count++].length=0;
             fscanf(fp1,"%s%lx",in,&loc);
       }
       while(strcmp(in,"T")!=0)
             fscanf(fp1,"%s",in);
     }
     if(strcmp(in,"T")==0)
     while(strcmp(in,"E")!=0)
     fscanf(fp1,"%s",in);
     fscanf(fp1,"%s",in);
     start=start+len;
   }
   for(i=0;i<count;i++)
   fprintf(fp2,"%s\t%s\t%lx\t%d\n",table[i].csect,table[i].sym_name,table[i].add,table[i].length);
   printf("\nProgram Completed Successfully...\n");
   getch();
}







OUTPUT:


Implementation Of Pass1 Of A Direct Linking Loader:
-------------------------------------------------------------------

Enter the Location where the program has to be loaded: 4000

Program Completed Successfully...





INPUT FILE:

LINK1IN.TXT

H     PROGA    000000   000070
D     LISTA      000040   ENDA     000054
R     LISTB      ENDB    LISTC     ENDC
T     000020   10    03201D    77100004    150014
T     000054   16    100014     15100006    00002F    100014    FFFFC0
M    000024   05    +LISTB
M    000054   06    +LISTC
M    000058   06    +ENDC
M    000064   06    +LISTB
E     000000

H     PROGB     000000    000088
D     LISTB       000060    ENDB     000070
R     LISTA       ENDA     LISTC     ENDC
T     000036   11    03100000    772027       05100000
T     000070   18    100000        05100006   05100020    05100030   100000
M    000037   05    +LISTA
M    000044   05    +ENDA
M    000070   06    +ENDA
M    000074   06    +ENDC
M    000078   06    +ENDC
M    000082   06    +ENDA
E     000000

H    PROGC     000000     000057
D    LISTC       000030     ENDC     000042
R    LISTA       ENDA      LISTB     ENDB
T    000018    12    03100000    77100004    05100000
T    000042    15    100030        100008        100011     100000    100000
M   000019    05    +LISTA
M   000023    05    +LISTB
M   000027    05    +ENDA
M   000048    06    +LISTA
M   000051    06    +ENDA
M   000054    06    +LISTB
E    000000


OUTPUT FILE:


LINK1OUT.TXT


CSECT               SYM_NAME          ADDRESS       LENGTH
PROGA                                                 4000                  70
                                LISTA                    4040                  0
                                ENDA                    4054                  0
PROGB                                                 4046                 88
                                LISTB                    40a6                  0
                                ENDB                    40b6                  0
PROGC                                                 409e                  57
                                LISTC                    40ce                   0

                                ENDC                    40e0                  0

IMPLEMENTATION OF A RELOCATION LOADER

IMPLEMENTATION OF A RELOCATION LOADER

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct object_code
{
   int locctr; char add[10];
}obcode[300];
void main()
{
   char in[100][16],out[100][16],bin[20],addr[20],stloc[10];
   int len,bitmask,loc,tlen=0,tloc,textloc,i=0,location,j,k,count=0,start,n,num=0,inc=0;
   FILE *fp1,*fp2;
   clrscr();
   printf("\nImplementation Of A Relocation Loader:");
   printf("\n--------------------------------------\n\n");
   fp1=fopen("loadin.txt","r");
   fp2=fopen("loadout1.txt","w");
   printf("Enter the Location where the program has to be loaded : ");
   scanf("%s",stloc);
   start=atoi(stloc);
   location=start;
   tloc=start;
   fscanf(fp1,"%s",in[i]);
   while(strcmp(in[i],"T")!=0)
   {
     strcpy(out[i],in[i]); i++;
     fscanf(fp1,"%s",in[i]);
     strcpy(out[i],in[i]);
   }
   itoa(start,out[2],10);
   while(strcmp(in[i],"E")!=0)
   {
     strcpy(out[i],in[i]);
     if(strcmp(in[i],"T")==0)
     {
       for(j=0;j<3;j++)
       {
             i++;
             fscanf(fp1,"%s",in[i]);
             strcpy(out[i],in[i]);
       }
       bitmask=atoi(out[i]);
       itoa(bitmask,bin,2);
       strcpy(out[i],NULL);
       textloc=atoi(out[i-2]);
       textloc=textloc+start;
       itoa(textloc,out[i-2],10);
       for(n=0;n<(textloc-(tloc+tlen));n++)
       {
             strcpy(obcode[inc].add,"XX");
             obcode[inc++].locctr=location++;
       }
       tlen=atoi(out[i-1]);
       tloc=textloc; k=0;
     }
     else
     {
       if(bin[k]=='1')
       {
             num=0; len=strlen(out[i]);
             strcpy(addr,NULL);
             for(j=2;j<len;j++)
             {
               addr[num]=out[i][j];
               out[i][j]='\0';
               num++;
             }
             loc=atoi(addr); loc=loc+start;
             itoa(loc,addr,10);
             strcat(out[i],addr);
       }
       k++;
       len=strlen(out[i]); num=0;
       for(n=0;n<len;n++)
       {
             obcode[inc].add[num++]=out[i][n];
             if(num>1)
             {
               obcode[inc++].locctr=location++;
               num=0;
             }
       }
     }
     i++;
     fscanf(fp1,"%s",in[i]);
   }
   strcpy(out[i],in[i]); i++;
   fscanf(fp1,"%s",in[i]);
   loc=atoi(in[i]); loc=loc+start;
   strcpy(out[i],itoa(loc,addr,10));
   count=0; i=0; n=0;
   fprintf(fp2,"%d\t",obcode[n].locctr);
   for(n=0;n<inc;n++)
   {
     fprintf(fp2,"%s",obcode[n].add);
     i++;
     if(i>3)
     {
       fprintf(fp2,"\t");
       i=0; count++;
     }
     if(count>3)
     {
       fprintf(fp2,"\n%d\t",obcode[n+1].locctr);
       count=0;
     }
   }
   printf("\nProgram Completed Successfully...\n");
   getch();
}























OUTPUT:


Implementation Of A Relocation Loader:
----------------------------------------------------

Enter the Location where the program has to be loaded : 6000

Program Completed Successfully...



INPUT FILE:


LOADIN.TXT

H    PROG1    000000    000018
T    000000   15    000009    180012    0C0015   000005    000010
T    000023   18    000034    200029    130043    0C0054   000006    00015
E    000000



OUTPUT FILE:


LOADOUT1.TXT

6000    1860120C              00150000      05006010      XXXXXXXX        
6016    XXXXXXXX        20602913      00430C00    54000006    

6032    006015

IMPLEMENTATION OF AN ABSOLUTE LOADER

IMPLEMENTATION OF AN ABSOLUTE LOADER

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct object_code
{
   int locctr; char byte[5];
};
struct object_code code[200];
void main()
{
   FILE *fp1,*fp2;
   char input[15];
   int i,len,n=0,count=0,inc=0,textloc,tlen,tloc=0,num=0,loc;
   clrscr();
   printf("\nImplementation Of An Absolute Loader:");
   printf("\n-------------------------------------\n\n");
   fp1=fopen("loadin.txt","r");
   fp2=fopen("loadout.txt","w");
   rewind(fp1);  rewind(fp2);
   fscanf(fp1,"%s",input);
   if(strcmp(input,"H")==0)
   {
     for(i=0;i<4;i++)
     {
       if(i==1)
             fscanf(fp1,"%x",&loc);
       else
             fscanf(fp1,"%s",input);
     }
   }
   tloc=loc;
   while(strcmp(input,"E")!=0)
   {
     if(strcmp(input,"T")==0)
     {
       fscanf(fp1,"%x",&textloc);
       for(i=0;i<(textloc-(tloc+tlen));i++)
       {
             strcpy(code[inc].byte,"XX");
             code[inc++].locctr=loc++;
       }
       fscanf(fp1,"%x",&tlen);
       tloc=textloc;
     }
     else
     {
       len=strlen(input);
       for(i=0;i<len;i++)
       {
             code[inc].byte[num++]=input[i];
             if(num>1)
             {
               code[inc].locctr=loc;
               loc++;  inc++;  num=0;
             }
       }
     }
     fscanf(fp1,"%s",input);
   }
   n=0; i=0; count=0;
   fprintf(fp2,"%x\t",code[i].locctr);
   for(i=0;i<inc;i++)
   {
     fprintf(fp2,"%s",code[i].byte);
     n++;
     if(n>3)
     {
       fprintf(fp2,"\t");
       n=0; count++;
     }
     if(count>3)
     {
       fprintf(fp2,"\n%x\t",code[i+1].locctr);
       count=0;
     }
   }
   printf("\nProgram Completed Successfully...\n");
   getch();
}








OUTPUT:


Implementation Of An Absolute Loader:
--------------------------------------------------

Program Completed Successfully...


INPUT FILE:


LOADIN.TXT

H      PROG1     001000    000018
T      001000   15   001009   181012   0C1015   000005    000010
T      001023   18   001034   201029   131043    0C0054   000006    000015
E      001000


OUTPUT FILE:


LOADOUT.TXT

1000    00100918               10120C10            15000005              000010XX           
1010    XXXXXXXX        XXXXXXXX    XXXXXXXX       XX001034          
1020    20102913               10430C00            54000006              000015


Followers