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

       if (!seg_open_flag)

       {

      printf("\nline %i:segment not open",number);

      exit(0);

       }

       seg_open_flag=0;

       fprintf(F1,"\t%10i %6.4X          \t%-s",number,offs,cmdbuf);

       printf("\t%10i %6.4X          \t%-s",number,offs,cmdbuf);

       Seg_End=offs;

      break;

      default:          /* db или dw */

       if (!seg_open_flag)

       {

      printf("\nline %i:segment not open",number);

      exit(0);

       }

       parsep=parse(lexbuf,parsep);

       if (strtoi(lexbuf,&n))

       {

      printf("\nLine%d",number);

      printf(":Bad number");

      exit(0);

       }

       if (op1num==DIR_DB)

       {

      fprintf(F1,"\t%10i %6.4X %-6.2X   \t%-s ",number,offs,n,cmdbuf);

      printf("\t%10i %6.4X %-6.2X   \t%-s ",number,offs,n,cmdbuf);

       }

       if (op1num==DIR_DW)

       {

      fprintf(F1,"\t%10i %6.4X %-6.4X   \t%-s ",number,offs,n,cmdbuf);

      printf("\t%10i %6.4X %-6.4X   \t%-s ",number,offs,n,cmdbuf);

       }

       if (op1num==DIR_DD)

       {

      fprintf(F1,"\t%10i %6.4X %-6.8X   \t%-s ",number,offs,n,cmdbuf);

      printf("\t%10i %6.4X %-6.8X   \t%-s ",number,offs,n,cmdbuf);

       }

       parsep=cmdbuf;

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

       offs=offs+op1num;

      break;

     }

     goto begin;

    }

   }

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

   {

    if (seg_open_flag)

    {

     printf("\nline %i: segment  open",number);

     exit(0);

    }

    parsep = parse(lexbuf,parsep);

    if (parsetyp)

    {

     printf("\n%i:Must comand not must have reguest an operand",number);

     exit(0);

    }

    fprintf(F1,"\t%10i \t%25s",number,cmdbuf);

    printf("\t%10i \t%25s",number,cmdbuf);

    goto runlist;

   }

   if (!seg_open_flag)

   {

    printf("\nline %i: segment not open",number);

    exit(0);

   }

   parsep=parse(lexbuf,parsep);

   if (operandcount[opcode]) /* Проверка на наличие операндов у команды */

    if (parsetyp!=PT_WORD)

    {

     printf("\nLine %d",number);

     printf(":Must comand not reguest an operands");

     exit(0);

    }

  /* Анализ первого операнда */

   if(lexbuf)

   for(int ee=0;ee<k;ee++)

   {

     if(strcmp(labeltab[ee].mnem,lexbuf)==0)

     {

       ttt=labeltab[ee].ef_adr-offs;

       fprintf(F1,"\t%10i %6.4X %s %02X         %-s",number,offs,mnem[opcode],ttt,cmdbuf);

       printf("\t%10i %6.4X %s %02X         %-s",number,offs,mnem[opcode],ttt,cmdbuf);

       offs+=2;

       goto begin;

     }

   }

   if (0>(op1num=findstr(registers,lexbuf)))

   {

    printf("\nline %d",number);

    printf(":Undefiner symbol %s",lexbuf);

    exit(0);

   }

   if (operandcount[opcode]==1) /* Если команда с одним операндом */

   {

    if (opcode==OP_DEC) op1num=op1num+8;

    fprintf(F1,"\t%10i %6.4X %s%c           %-s",number,offs,mnem[opcode],cop2[op1num],cmdbuf);

    printf("\t%10i %6.4X %s%c           %-s",number,offs,mnem[opcode],cop2[op1num],cmdbuf);

    offs++;

    goto begin;

   }

  /* Проверка на наличие второго операнда : если он есть , то ошибка */

   parsep=parse(lexbuf,parsep);

   if (operandcount[opcode]==1)

    if (parsetyp==PT_WORD)

    {

     printf("\nLine%d",number);

     printf(":The command must be have one operand");

     exit(0);

    }

   if (parsetyp) /* Проверка на наличие разделителя между операндами*/