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();
}
Висновок: в процесі лабораторної роботи були вивчені принципи компіляції програм, а також методи написання компіляторів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.