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

    if (lexbuf[0]!=',')

     {

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

      printf(":must be ','");

      exit(0);

     }

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

   parsep=parse(lexbuf,parsep);

  /* Если его нет, то ошибка */

   if (operandcount[opcode==2])

    if (parsetyp!=PT_WORD)

    {

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

     printf(":must comand delimited one operand ");

     exit(0);

    }

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

   {

    if (strtoi(lexbuf,&n))

    {

     if (0 > (op2num=find_sym(lexbuf)))

     {

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

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

      exit(0);

     }

     else

     {

      if (strcomp(symtab[op2num].type,sym[2]))

      {

       fprintf(F1,"\t%10i %6.4X %s 16 %.4Xr   %-s",number,offs,mnem[opcode],symtab[op2num].ef_adr,cmdbuf);

       printf("\t%10i %6.4X %s 16 %.4Xr   %-s",number,offs,mnem[opcode],symtab[op2num].ef_adr,cmdbuf);

       offs=offs+operandcount[opcode]+2;

       goto begin;

      }

      if (strcomp(symtab[op2num].type,sym[1]))

      {

       fprintf(F1,"\t%10i %6.4X %s 8 %.4Xr   %-s",number,offs,mnem[opcode],symtab[op2num].ef_adr,cmdbuf);

       printf("\t%10i %6.4X %s 8 %.4Xr   %-s",number,offs,mnem[opcode],symtab[op2num].ef_adr,cmdbuf);

       offs=offs+operandcount[opcode]+1;

       goto begin;

      }

     }

    }

    else

    {

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

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

     offs=offs+operandcount[opcode];

     if ((n < 0)||(n > 255))

      offs=offs+1;

     goto begin;

    }

   }

   if (op1num % 2)

    op2num=op2num+8;

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

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

   offs=offs+operandcount[opcode];

   goto begin;

  }

  while(parsetyp);

  printf("\n");

 }

 fclose(F);

 /* Вывод таблиц символов и сегментов */

runlist:

 fprintf(F1,"\n══════════════════════ Table of segment ══════════════════════════════");

 printf("\n══════════════════════ Table of segment ══════════════════════════════");

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

 {

   fprintf(F1,"\n\t   %10s  %4.4X",segtab[index].name,segtab[index].length);

   printf("\n\t   %10s  %4.4X",segtab[index].name,segtab[index].length);

 }

 fprintf(F1,"\n\n══════════════════════════ Symbol table ═══════════════════════════");

 printf("\n\n══════════════════════════ Symbol table ══════════════════════════════");

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

 {

  fprintf(F1,"\n\t   %10s%10s%10s:%4.4X",symtab[index].mnem,symtab[index].type,symtab[index].atrib,symtab[index].ef_adr);

  printf("\n\t   %10s%10s%10s:%4.4X",symtab[index].mnem,symtab[index].type,symtab[index].atrib,symtab[index].ef_adr);

 }

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

 {

  fprintf(F1,"\n\t   %10s%10s%10s:%4.4X",labeltab[index].mnem,labeltab[index].type,labeltab[index].atrib,labeltab[index].ef_adr);

  printf("\n\t   %10s%10s%10s:%4.4X",labeltab[index].mnem,labeltab[index].type,labeltab[index].atrib,labeltab[index].ef_adr);

 }

 fclose(F1);

 getch();

}

Висновок: в процесі лабораторної роботи були вивчені принципи компіляції програм, а також методи написання компіляторів.