Асемблери. Принципи компіляції програм і методів написання компіляторів (Звіт з лабораторної роботи № 7), страница 2

      buf[0]=c;

      buf[1]=0;

      return str+1;

   }

  while ((*str)&&(!strconsist(separators,*str))&&(!strconsist(signs1,*str)))

  {

   *buf++=*str++;

   if (*str==':')

   {

      parsetyp=PT_LABEL;

      return str+1;

   }

  }

  *buf=0;

  parsetyp=PT_WORD;

  return str;

  }

 str++;

 }

 *buf=0;

 parsetyp=PT_EOST;

 return str;

}

/* Функция поиска строки в массиве строк

   если не найдено - принимает значение  -1,

   иначе - местоположение этой строки     */

int findstr(char *tab[], char *it)

{

 int cmdidx;

 cmdidx = 0;

 while(tab[cmdidx])

 {

  if(strcomp(tab[cmdidx], it))

   return cmdidx;

  cmdidx++;

 }

 return -1;

}

int find_sym (char buf[MAXSTR])

{

 int index;

 for (index=0;index < j; index++)

  if (strcomp(buf,symtab[index].mnem))

   return index;

 return -1;

}

void main(int argc,char *argv[])

{

 clrscr();

 unsigned char ttt;

 if(argc>2) { printf("Too many files"); exit(0);}

 int opcode, op1num, op2num, i=0,k=0,index;

 int seg_open_flag=0;  /*Флаг открытия сегмента*/

 int label_flag=0;     /*Флаг метки*/

 char codop1;

 int Seg_Begin,Seg_End;   /*  Начало и конец сегмента соответственно */

 char *segreg[]={"DS","CS","SS"};

 char *parsep;           /* Остаток от выделения лексемы */

 number=0;               /* Счетчик строк */

 char* temp;

 strcpy(argv[1],"test");

 strcpy(temp,argv[1]);

 strcat(temp,".asm");

 F=fopen(temp,"r");

 if (F==NULL)

 {

  printf("\nFile not found");

  exit(0);

 }

 strcpy(temp,argv[1]);

 strcat(temp,".lst");

 F1=fopen(temp,"w");

 if (F1==NULL)

 {

  printf("\nFile not created");

  exit(0);

 }

begin2:

 while (!feof(F))

 {

  fgets(cmdbuf,MAXSTR,F);

   number++;

  strupcase(cmdbuf);

  if(strconsist("\n",cmdbuf[0]))   /* Если строка пуста */

   goto begin2;

  parsep = cmdbuf;

  do

  {

  restart2:

   parsep=parse(lexbuf,parsep);

   if (parsetyp==PT_LABEL)       /* Если команда с меткой */

   {

      if (label_flag) exit(0);

      strcpy(labeltab[k].mnem,lexbuf); /* Занесение метки в таблицу символов */

      strcpy(labeltab[k].type,sym[0]);

      strcpy(labeltab[k].atrib,segreg[i]);

    labeltab[k].ef_adr=offs;

    k++;

    if (strconsist("\n",parsep[0]))

     goto begin2;

    label_flag=1;

    goto restart2;

   }

   if (0>(opcode=findstr(mnemonics,lexbuf))) /* Если это не команда

                         то следующая лексема должна быть директивой  */

   {

    if( 4== ( op1num=findstr(directives,lexbuf) ) ) break;

    parsep=parse(lexbuf,parsep);

    if (0>(op1num=findstr(directives,lexbuf))) exit(0);

    else

    {

     /* Формирование листинга по директивам */

     switch (op1num)

     {

      case DIR_SEG:   /* Директива - segment */

       seg_open_flag=1;

       offs=0;

       Seg_Begin=offs;

       cmdbuf[0]=0;

      break;

      case DIR_ENDS:  /* Директива - ends */

       if (!seg_open_flag)

      exit(0);

       seg_open_flag=0;

       Seg_End=offs;

       parsep=parse(segtab[i].name,cmdbuf);

       segtab[i].length=Seg_End-Seg_Begin;

       i++;

      break;

      default:          /* db или dw */

       if (!seg_open_flag) exit(0);

       parsep=parse(lexbuf,parsep);

       if (strtoi(lexbuf,&n)) exit(0);

       parsep=cmdbuf;

       parsep=parse(symtab[j].mnem,parsep);

       strcpy(symtab[j].type, sym[op1num]);

       strcpy(symtab[j].atrib,segreg[i]);

       symtab[j].ef_adr=offs;

       offs=offs+op1num;

       j++;

      break;

     }

     goto begin2;

    }

   }

   if (!operandcount[opcode])  /* Если директива  end  */