if ((index > 0)&&(index < macrotab[cmdidx].str_count))
goto macrogets;
goto begin;
}
}
if ((index > 0)&&(index < macrotab[cmdidx].str_count))
goto macrogets;
goto begin;
}
if (OP_ELSE==(opcode=findstr(mnemonics,lexbuf)))
{
if (!seg_open_flag)
{
printf("\nline %d:Not open segment",number);
exit(0);
}
/* Если встретили директиву else,то меняем значение флага
на противоположное */
fprintf(F1,"\t%10i\t%23s",number,cmdbuf);
flag=!flag;
if ((index > 0)&&(index < macrotab[cmdidx].str_count))
goto macrogets;
goto begin;
}
if (OP_ENDIF==(opcode=findstr(mnemonics,lexbuf)))
{
if (!seg_open_flag)
{
printf("\nline %d:Not open segment",number);
exit(0);
}
/* Устанавливаем флаг на компиляцию */
flag=0;
fprintf (F1,"\t%10i\t%24s",number,cmdbuf);
if ((index > 0)&&(index < macrotab[cmdidx].str_count))
goto macrogets;
goto begin;
}
/* End if compilation */
if (0>(opcode=findstr(mnemonics,lexbuf)))
{
parsep=parse(lexbuf,parsep);
if (0>(op1num=findstr(directories,lexbuf)))
{
printf("\nline %d",number);
printf(":Wrong mnemonic");
exit(0);
}
else
{
if (flag)
{
fprintf(F1,"\t%10i \t%-s",number,cmdbuf);
goto ifgets;
}
switch (op1num)
{
case DIR_SEG:
seg_open_flag=1;
offs=0;
Seg_Begin=offs;
fputs(cmdbuf,F3);
fprintf(F1,"\t%10i %6.4X \t%-s",number,offs,cmdbuf);
cmdbuf[0]=0;
break;
case DIR_ENDS:
if (!seg_open_flag)
{
printf("\nline %d:Not open segment",number);
exit(0);
}
seg_open_flag=0;
fprintf(F3,cmdbuf);
fprintf(F1,"\t%10i %6.4X \t%s",number,offs,cmdbuf);
Seg_End=offs;
parsep=parse(segtab[i].name,cmdbuf);
segtab[i].length=Seg_End-Seg_Begin;
i++;
segtab[i].name[0]=0;
break;
default:
if (!seg_open_flag)
{
printf("\nline %d:Not open segment",number);
exit(0);
}
fprintf(F3,cmdbuf);
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 %3.2X \t%-s ",number,offs,n,cmdbuf);
if (op1num==DIR_DW)
fprintf(F1,"\t%10i %6.4X %5.4X \t%-s ",number,offs,n,cmdbuf);
parsep=cmdbuf;
parsep=parse(symtab[j].mnem,parsep);
strcpy(symtab[j].type, sym[op1num]);
strcpy(symtab[j].atrib,seg_registr[i]);
symtab[j].ef_adr=offs;
offs=offs+op1num;
j++;
break;
}
goto begin;
}
}
if (!operandcount[opcode])
{
if (seg_open_flag)
{
printf("\nline %d:Open segment",number);
exit(0);
}
fprintf(F2,cmdbuf);
fprintf(F1,"\t%10i \t%-s",number,lexbuf);
goto runlist;
}
if (!seg_open_flag)
{
printf("\nline %d:Not open segment",number);
exit(0);
}
parsep=parse(lexbuf,parsep);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.